【发布时间】:2013-10-03 21:28:31
【问题描述】:
我对哈希算法了解不多。
在将文件转发到需要 MD2/MD5/SHA-X 中的文件哈希的远程系统(有点像 S3)之前,我需要在 Java 中计算传入文件的哈希值。 此哈希不是出于安全原因计算的,而只是为了一致性校验和。
我能够在转发文件时使用 Java 标准库的 DigestInputStream 实时计算此哈希值,但想知道哪种算法最适合避免使用 DigestInputStream 时的性能问题?
我的一位前同事测试并告诉我们,与 unix 命令行或文件相比,实时计算哈希可能非常昂贵。
修改过早优化: 我在一家公司工作,该公司旨在帮助其他公司将他们的文件非物质化。 这意味着我们有一批处理来自其他公司的文件传输。我们的目标是未来每天数百万个文档,实际上,这批的执行时间对我们的业务很敏感。
每天对 100 万个文档进行 10 毫秒的哈希优化,每天的执行时间减少了 3 小时,这是相当巨大的。
【问题讨论】:
-
您应该能够在一台使用单核的不错的机器上散列超过 100MB/s,因此除非您使用的是千兆互联网,否则它不应该成为真正的瓶颈。
-
过早的优化是万恶之源。我绝对认为您应该选择一个在技术上足以满足您的目标的哈希,如果它证明存在性能问题,请相应地进行更改...
-
如果您真的不需要安全性,那么 MD5 是一个不错的选择。但是,如果您能承受性能损失,请使用 SHA-2(SHA-256 或 SHA-512)
-
@CodesInChaos 我尝试在 80mb 文件上使用 MessageDigest,但消耗 InputStream 似乎要多花 300 毫秒。
-
@SebastienLorber 有了这个数字(260MB/s),只有当你有 2Gb/s 的网络连接时,散列才会限制你。如果这确实是一个限制,您可以切换到本机代码。原生 MD5 应该在 500 到 1000 MB/s 之间。
标签: java encryption hash