首页 > 后端开发 > php教程 > 同一文件分别用PHP/Python/Javascript读取并计算MD5,结果均不同,请教原因及解决方法

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

WBOY
发布: 2016-06-06 20:49:33
原创
1491 人浏览过

测试代码及结果如下:

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 版的不同很容易理解了:

  1. Python 2 中将文件以默认的文本模式打开,Windows API 对部分字符进行处理,导致读到的数据不一致;
  2. 正确的 MD5 值是 PHP 算出来的那个。file_get_contents 是 binary safe 的;
  3. 正确的 Python 2 & 3 代码如下:

    <code>hashlib.md5(open("test.torrent", 'rb').read()).hexdigest()
    </code>
    登录后复制
  4. 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>
登录后复制

打印出来的结果同上。

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板