我想使用Java-Security-Implementations在MATLAB中计算MD5(或其他)文件哈希值(RFC 1321符合)。因此我编码
mddigest=java.security.MessageDigest.getInstance('MD5');
filestream=java.io.FileInputStream(java.io.File(filename));
digestream=java.security.DigestInputStream(filestream,mddigest);
md5hash=reshape(dec2hex(typecast(mddigest.digest,'uint8')),1,[])
并且例程正常。不知何故,结果与给定的工具不同 也许文件编码有问题? MATLAB内部不应该解决这个问题吗? 我想重现结果,一个是md5sum(在linux上),它与HashCalc(Windows)相同。
答案 0 :(得分:6)
有两个问题:
此代码有效:
mddigest = java.security.MessageDigest.getInstance('MD5');
filestream = java.io.FileInputStream(java.io.File(filename));
digestream = java.security.DigestInputStream(filestream,mddigest);
while(digestream.read() ~= -1) end
md5hash=reshape(dec2hex(typecast(mddigest.digest(),'uint8'))',1,[]);
/!\ 修改:p.vitzliputzli回答了very much faster solution应该使用的代替此代码。
答案 1 :(得分:2)
你永远不会read from the DigestInputStream
。
这意味着不会消化任何字节。
您必须阅读整个文件(通过DigestInputStream
)和然后调用digest
以获取摘要值。
答案 2 :(得分:2)
但是,我们可以调整Thomas Pornin的solution(丢弃FileInputStream)以便到达:
_background
此解决方案大约需要0.018秒来计算713kB文件的哈希值,而另一个解决方案需要大约31秒。