Maison >développement back-end >tutoriel php >同一文件分别用PHP/Python/Javascript读取并计算MD5,结果均不同,请教原因及解决方法
测试代码及结果如下:
PHP:
<code class="lang-php">echo md5(file_get_contents('test.torrent')); //e699b0e7535cebc1b10de1613d6797fb </code>
Python:
<code class="lang-python">print hashlib.md5(open("test.torrent").read()).hexdigest() #7cc752c88ae69677afe59ee7c3300e9d </code>
Javascript:
<code class="lang-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 </code>
测试代码及结果如下:
PHP:
<code class="lang-php">echo md5(file_get_contents('test.torrent')); //e699b0e7535cebc1b10de1613d6797fb </code>
Python:
<code class="lang-python">print hashlib.md5(open("test.torrent").read()).hexdigest() #7cc752c88ae69677afe59ee7c3300e9d </code>
Javascript:
<code class="lang-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 </code>
根据你在问题评论中补充的信息,Python 2 版与 PHP 版的不同很容易理解了:
file_get_contents
是 binary safe 的;正确的 Python 2 & 3 代码如下:
<code>hashlib.md5(open("test.torrent", 'rb').read()).hexdigest() </code>
CryptoJS 这个东西是第三方的。提问者没有提供,因此无法测试。
我做了一下测试,两种python的方法,一种javascript的方法,加一种是Linux shell命令,得出来的MD5都是一样的。PHP没测试,但我相信也应该一样。 python方法一:
<code class="lang-python">import md5 m = md5.new("xxx\n") print m.hexdigest() 结果是:6de9439834c9147569741d3c9c9fc010 </code>
python方法二:
<code class="lang-python">import hashlib h = hashlib.md5("xxx\n") print h.hexdigest() 结果也是:6de9439834c9147569741d3c9c9fc010 </code>
javascript的MD5,我从这下载的:http://www.myersdaily.org/joseph/javascript/md5.js,第101行有个语法错误,加上var即可。得出的结果跟上面的结果一样。
Linux shell:
<code>md5sum xxx回车后按ctrl + D </code>
打印出来的结果同上。