如何为com.google.appengine.api.blobstore.BlobInfo计算md5Hash

8
我们正在努力避免保存重复的文件。然而,我们的 md5 结果总是与 BlobInfo 不同。
我们的计算方法如下:
    MessageDigest messageDigest = java.security.MessageDigest.getInstance("MD5");
    digest = messageDigest.digest(bytes);
    String digestString = DigestUtils.md5Hex(digest);

无法匹配:(new BlobInfoFactory().loadBlobInfo(blobKey)).getMd5Hash();

示例不匹配:

google vs my own calculation:
8cdeb6db94bc4fd156e2975fd8ebbcf2 vs 9003b37afbf3637de96c35774069453f 
65a25dafcba58d16d58a9c7585cc3932 vs 52383159f7d27417d50121aaee2728b5 
5cccc2d690fdc0c254234d5526876b34 vs 8196da9b6733daa60e08d927693df483 

它在生产服务器上。(我们没有测试开发环境)


你是在开发应用服务器还是在生产环境中尝试这个? - Sebastian Kreft
还有两个问题,你能试试空文件吗?你是怎样保存这些文件的? - Sebastian Kreft
如果我们创建空文件,结果将是"d41d8cd98f00b204e9800998ecf8427e"与"59adb24ef3cdbe0297f05b395827453f"的比较。 - Tom Fishman
我们创建文件的方式类似于http://javatechnologytutorials.blogspot.com/p/google-app-engine-programatically.html createBlobFile(...)。不同之处在于我们使用writeChannel.write(ByteBuffer.wrap(bytes));而不是PrintWriter。 - Tom Fishman
因此,对于空文件,GAE正在计算正确的MD5。看起来您计算md5哈希的方式可能存在问题。 - Sebastian Kreft
显示剩余2条评论
1个回答

7
Sebastian Kreft在上面的评论讨论中是正确的。我复制的代码是错误的,应该只是这样:
String digestString = DigestUtils.md5Hex(bytes);

Sebastian Kreft使用了这个技巧来查验空文件的MD5值,它应该始终是d41d8cd98f00b204e9800998ecf8427e!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接