5

我想使用 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)的结果。

4

3 回答 3

6

有两个问题:

  1. 你不读文件。
  2. 您必须先转置矩阵,然后再对其进行整形。

此代码有效:

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回答了一个更快的解决方案,应该使用它来代替这个解决方案。

于 2012-10-31T12:18:30.443 回答
3

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

但是,我们可以调整 Thomas Pornin 的解决方案(丢弃 FileInputStream)以达到:

mddigest   = java.security.MessageDigest.getInstance('MD5'); 

bufsize = 8192;

fid = fopen(filename);

while ~feof(fid)
    [currData,len] = fread(fid, bufsize, '*uint8');       
    if ~isempty(currData)
        mddigest.update(currData, 0, len);
    end
end

fclose(fid);

hash = reshape(dec2hex(typecast(mddigest.digest(),'uint8'))',1,[]);

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

于 2016-11-08T10:00:11.103 回答
2

你从来没有DigestInputStream.

这意味着不会消化任何字节。

您必须读取整个文件(通过DigestInputStream),然后调用digest以获取摘要值。

于 2012-08-27T10:54:48.183 回答