我想在MATLAB中使用Java-Security-Implementations来计算MD5 (或其他)文件散列(RFC 1321 conform)。因此我编写了代码
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)的结果相当。
发布于 2012-10-31 20:18:30
有两个问题:
,
下面的代码可以工作:
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,而不是这个。
发布于 2016-11-08 18:00:11
斯蒂芬的解决方案是有效的,但由于MATLAB的限制,不能为DigestInputStream (或任何其他InputStream)的byte[]方法提供JAVA数组,所以速度非常慢。
然而,我们可以改编Thomas Pornin的solution (丢弃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,[]);这个解决方案计算一个713kB文件的哈希大约需要0.018s,而另一个解决方案大约需要31s。
发布于 2012-08-27 18:54:48
你从来没有read from the DigestInputStream过。
这意味着不会对任何字节进行摘要。
您必须读取整个文件(通过DigestInputStream),然后调用digest来获取摘要值。
https://stackoverflow.com/questions/12140458
复制相似问题