您好,欢迎访问一九零五行业门户网

同一文件分别用PHP/Python/Javascript读取并计算MD5,结果均不同,请教原因及解决方法

测试代码及结果如下:
php:
echo md5(file_get_contents('test.torrent'));//e699b0e7535cebc1b10de1613d6797fb

python:
print hashlib.md5(open(test.torrent).read()).hexdigest()#7cc752c88ae69677afe59ee7c3300e9d

javascript:
var draganddrop = function(){ if (!window.file || !window.filelist || !window.filereader) { return false; } var ignoredrag = function(e) { e.originalevent.stoppropagation(); e.originalevent.preventdefault(); } var drop = function(e) { ignoredrag(e); var dt = e.originalevent.datatransfer; var droppedfiles = dt.files; $.each(droppedfiles, function(index, file) { decodefile(file); }); } $('body') .on('dragenter', ignoredrag) .on('dragover', ignoredrag) .on('drop', drop);};var decodefile = function(file) { var filereader = new filereader(); var filedata = filereader.readasbinarystring(file); filereader.onload = function(){ var filedata = this.result; console.log(cryptojs.md5(filedata)); }}draganddrop(); //393fe44680d69ea00fd0a4a2fb3fa8c5

回复内容: 测试代码及结果如下:
php:
echo md5(file_get_contents('test.torrent'));//e699b0e7535cebc1b10de1613d6797fb

python:
print hashlib.md5(open(test.torrent).read()).hexdigest()#7cc752c88ae69677afe59ee7c3300e9d

javascript:
var draganddrop = function(){ if (!window.file || !window.filelist || !window.filereader) { return false; } var ignoredrag = function(e) { e.originalevent.stoppropagation(); e.originalevent.preventdefault(); } var drop = function(e) { ignoredrag(e); var dt = e.originalevent.datatransfer; var droppedfiles = dt.files; $.each(droppedfiles, function(index, file) { decodefile(file); }); } $('body') .on('dragenter', ignoredrag) .on('dragover', ignoredrag) .on('drop', drop);};var decodefile = function(file) { var filereader = new filereader(); var filedata = filereader.readasbinarystring(file); filereader.onload = function(){ var filedata = this.result; console.log(cryptojs.md5(filedata)); }}draganddrop(); //393fe44680d69ea00fd0a4a2fb3fa8c5

根据你在问题评论中补充的信息,python 2 版与 php 版的不同很容易理解了:
python 2 中将文件以默认的文本模式打开,windows api 对部分字符进行处理,导致读到的数据不一致;正确的 md5 值是 php 算出来的那个。file_get_contents 是 binary safe 的;正确的 python 2 & 3 代码如下:
hashlib.md5(open(test.torrent, 'rb').read()).hexdigest()
cryptojs 这个东西是第三方的。提问者没有提供,因此无法测试。
我做了一下测试,两种python的方法,一种javascript的方法,加一种是linux shell命令,得出来的md5都是一样的。php没测试,但我相信也应该一样。python方法一:
import md5m = md5.new(xxx\n)print m.hexdigest()结果是:6de9439834c9147569741d3c9c9fc010
python方法二:
import hashlibh = hashlib.md5(xxx\n)print h.hexdigest()结果也是:6de9439834c9147569741d3c9c9fc010
javascript的md5,我从这下载的:http://www.myersdaily.org/joseph/javascript/md5.js,第101行有个语法错误,加上var即可。得出的结果跟上面的结果一样。
linux shell:
md5sumxxx回车后按ctrl + d
打印出来的结果同上。
其它类似信息

推荐信息