通过Java在Matlab中计算MD5哈希(符合RFC 1321)

时间:2012-08-27 10:43:03

标签: java matlab hash md5 rfc

我想使用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)相同。

3 个答案:

答案 0 :(得分:6)

有两个问题:

  1. 您没有阅读该文件。
  2. 您必须转置矩阵 在重塑之前。
  3. 此代码有效:

    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)

由于MATLAB的限制是无法向DigestInputStream(或任何其他InputStream)的read方法提供JAVA byte []数组,因此Stephane的解决方案可以工作但速度很慢。

但是,我们可以调整Thomas Pornin的solution(丢弃FileInputStream)以便到达:

_background

此解决方案大约需要0.018秒来计算713kB文件的哈希值,而另一个解决方案需要大约31秒。