我正在寻找比SHA256更快的算法。我有超过10亿条记录需要进行哈希和验证是否唯一。目前我使用MD5来加速,避免碰撞,然后再使用SHA256进行处理。这样做可以稍微提高一下性能,但我仍然需要更快的算法。我正在寻找在C#中实现的哈希函数名称或示例伪代码,以便我可以在C#中重现它。
我正在寻找比SHA256更快的算法。我有超过10亿条记录需要进行哈希和验证是否唯一。目前我使用MD5来加速,避免碰撞,然后再使用SHA256进行处理。这样做可以稍微提高一下性能,但我仍然需要更快的算法。我正在寻找在C#中实现的哈希函数名称或示例伪代码,以便我可以在C#中重现它。
cryptography
标签来提问,但只提到了加密哈希函数,听起来您并不真正需要加密安全性,尤其是因为您说:
加密哈希函数有四个属性:我有超过10亿条记录需要哈希,并验证它们是否唯一。
你真正感兴趣的只是第一个质量和唯一性,这只是与加密安全的其他三个属性部分相关的较小规模的要求。
- 对于任何给定的消息,计算哈希值很容易
- 生成具有给定哈希的消息是困难的
- 修改消息而不更改哈希是困难的
- 找到两个具有相同哈希的不同消息是困难的。
Object.GetHashCode()
方法? MSDN参考文献对使用哈希函数有很多介绍。您没有提及正在哈希的数据,因此很难说输出是否在对象之间是唯一的。您如何将对象输入到MD5哈希器中?我假设您正在获取其二进制表示。类似的方法可以用于使用内置的非加密哈希函数。做些不同的事情怎么样?
对每条记录使用一种简单的哈希函数,比如将每条记录映射到32位INT的哈希表中,就像插入记录时使用的那种。如果发生哈希冲突,则比较冲突的记录以确定唯一性。
如果遇到冲突记录,您可以使用MD5进行检查,然后再使用SHA256甚至SHA128进行检查。
2^128
个密钥。对于10亿
条记录(即生日),发生碰撞的近似概率为1 - exp(-1e18 / 2^129) ~= 1.5e-21
。碰撞的概率很低,但比人们最初可能期望的要高得多(本评论的初始版本包含错误,我深表歉意)。有关详细信息,请参见此答案。 - jason从您提出的问题方式来看,似乎您不需要一个安全级别的哈希算法。如果您已经传达了您想要实现的所有主要要求,那么您可能根本不需要哈希算法。
如果您正在构建一个名为“unique”的方法,该方法返回布尔值true,仅当两行是唯一的时才返回true,您可以按照以下三个顺序使用以下三个行特征来获得速度并保持可靠性。
如果记录长度是可变的,则第一个特征可能已经知道。第二个特征可以在存储时快速计算。即使您使用安全级别的哈希算法(您已经表示这些算法太慢了),在十亿条记录中,您仍然必须覆盖碰撞的可能性。因此,当校验和匹配时(如果校验和具有足够数量的位,则这种情况很少发生),您将不得不逐字节比较实际值。