使用 SHA-2。总是。SHA-1 应保留给由于与遗留代码的互操作性问题而无法使用 SHA-2 的情况。
在执行实际测量之前,不会出现性能问题。哈希函数很快。在大多数情况下,哈希函数性能的影响可以忽略不计;即使检测到它也可能很困难。安全是第一位的。由于在 SHA-1 中发现了弱点,因此使用它仍然需要一些强有力的理由。使用 SHA-256 不会受到质疑;这是“默认选择”。但是,如果您使用 SHA-1,请做好被批评的准备。
请注意,有四个函数称为“SHA-2”:SHA-224、SHA-256、SHA-384 和 SHA-512。SHA-224 和 SHA-256 是相同的功能,除了内部参数(“初始值”)和输出大小(SHA-224 输出大小为 28 字节,而 SHA-256 提供 32 字节);它们具有相同的性能特征。同样,SHA-384 和 SHA-512 在性能方面具有相同的功能。SHA-512 使用 64 位算术运算,在提供 64 位操作码的平台上比 SHA-256 更快;在 32 位平台上,SHA-256 会更快(注意:在带有本机代码的 32 位 x86 上,可以使用 SSE2 操作码及其 64 位计算能力,因此有些在 32 位模式下,SHA-512 的本机代码实现将比 SHA-256 更快;OpenSSL 代码就是这样做的;但是,据我所知,.NET 中的 SHA-512 实现是“托管代码”)。此外,所有 SHA-* 函数都有一些基本粒度,因为它们按块处理数据:对于 SHA-256,块的长度为 64 字节,而 SHA-512 使用 128 字节的块;当散列非常短的数据元素时,较高的 SHA-512 粒度会相应地降低其性能。最后,SHA-256(在 32 位平台上)可能会产生更小的代码(即在 CPU 上使用更少的 L1 高速缓存)。
因此,如有疑问,请使用 SHA-256。如果您打算使用 SHA-1,那么您应该怀疑。
如果您想将哈希函数用于非加密用途(即弱点对您来说不是问题),那么请考虑MD4而不是 SHA-1 。