通常对于重复文件/数据检测,MD5 是速度和碰撞机会之间的良好折衷。如果有人故意制作文件来欺骗您的程序(它有点容易受到碰撞攻击),则 MD5 是不合适的。但是,如果您只是担心偶然发生冲突,那么它的 128 位宽度目前实际上总是足够的。
SHA-1 和 SHA-256 为您提供了一些针对故意碰撞攻击的保护(理论上但没有已知的 SHA-1 实际攻击;对于密钥数据,几乎不值得超过 160 位哈希码宽度)。SHA-1 的速度大约是 MD5 的一半。
当然,如果您使用 MD5,性能可能不会成为太大的问题。但这显然取决于数据的大小。您可能对我整理的有关Java中安全散列函数性能的一些信息感兴趣。
如果您确实需要更快的东西并且您只处理几百万条数据,那么另一个需要考虑的选项是 Numerical Recipes 作者提出的 64 位哈希算法。
Java's standard hashCode() implementation (of, say, String) is probably not suitable: aside from any issues about the quality of the hash, its 32-bit width means that you'll expect a collision after just 16,000 items or so.