同一文件分别用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
埃及式辱骂
11 years, 1 month ago
Answers
根据你在问题评论中补充的信息,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 这个东西是第三方的。提问者没有提供,因此无法测试。
五仁超好吃
answered 11 years, 1 month ago