正在寻找比MD5或SHA256更快的C#哈希

本文关键字:哈希 SHA256 寻找 MD5 | 更新日期: 2023-09-27 18:20:27

我正试图找到比SHA256更快的东西。我有超过10亿条记录需要散列并验证它们是否唯一。我目前正在通过MD5来运行它,这似乎很快,然后通过sha256来避免冲突。按照这个顺序运行它们似乎给了我一点性能提升,但我仍然需要更快。我正在寻找一些在c#中完成的散列的名称或示例,或者一些伪代码,这样我就可以在c#中重新创建它。

正在寻找比MD5或SHA256更快的C#哈希

这里的答案中有很多可疑的信息。你用cryptography标记了你的问题,只提到了加密哈希函数,但听起来你并不真正需要加密安全,特别是因为你说:

我有超过10亿条记录需要散列并验证它们是否唯一。

密码散列函数有四个属性:

  • 计算任何给定消息的哈希值都很容易
  • 生成具有给定哈希的消息是不可行的
  • 在不更改哈希的情况下修改消息是不可行的
  • 找到具有相同散列的两个不同消息是不可行的

你真的只对第一个质量感兴趣,而唯一性是一个较小规模的要求,只与加密安全的其他三个属性部分相关。

你为什么在乎

加密安全存在开销。你不需要它,而且你对速度感兴趣,为什么不跳过它呢?MD5和SHA家族的哈希宽度对于您的目的来说已经足够大了。

看看维基百科上的散列函数列表,或者看看关于普通散列函数的文章。更重要的是,内置的.NET哈希函数出了什么问题?你有没有试过只采用Object.GetHashCode()方法?MSDN引用中有很多关于使用散列函数的内容。你不会对你正在散列的数据说太多,所以很难说输出在你的对象之间是否是唯一的。您是如何将对象输入MD5哈希器的?我想你采用的是二进制表示。类似的方法也可以用于使用内置的非加密哈希函数。

您可能会担心内置哈希函数的唯一性。它们只返回一个正则int,它是2^32,只比您使用的数据集大大约4倍。但是,您总是需要有一个散列函数的备份计划。冲突是不可行的,并非不可能。标准的回退是执行更昂贵的比较,通常是引用比较和字段值比较。

如果你还没有准备好对你的哈希输出进行精确的比较,你基本上是在倒计时,直到你得到一个假阳性。这对你来说可能不是什么大不了的事:只有你才能判断有什么不利因素

此外,执行另一个散列函数计算可能不会比直接比较快多少。在所有方面,你最好选择确定的事情,并进行冗长、直接的比较。

另一种常见的防冲突技术是使用多个密钥。因此,如果你的数据点有几个大的子组件,你可以独立地对其进行散列和比较。如果它有一些大的和一些小的组件(比如一些简单的数字类型),你可以对大的进行散列,并对小的进行直接比较。如果它们有一些数据很容易取序号(比如字符串的长度或一些容器的大小),则可以对这些位进行直接比较。

如果这对您不起作用,请查看wiki上列出的其他哈希函数的实现。这里有一个很好的MurmerHash3参考,它可以计算32位或128位的哈希值。列表中还有其他哈希函数,它们的哈希宽度也很长,并且还有可用的C#库。但正如该参考所指出的,Murmurhash比MD5和SHA函数快得多,尽管它没有与我上面提到的Object.GetHashCode方法进行直接比较。

做点不同的事情怎么样?

对每条记录使用一个简单的哈希函数,就像将记录插入哈希表时使用的函数一样,也许可以将每条记录映射到32位INT。然后,如果发生哈希冲突,则比较冲突记录的唯一性。

您可以使用MD5,然后如果遇到冲突记录,您可以使用SHA256甚至SHA128进行检查。

是否使用sha256检查每个记录?您应该只需要检查发生md5冲突的记录,即使使用md5,这种情况也应该很少见。在这一点上,当您只是比较重复项时,将原始记录与原始记录进行比较可能会更快,因为比较将返回第一个差异。

您甚至可以执行类似MD5的操作,如果发生冲突,则在两个值中添加一点额外的数据(相同),然后再次执行MD5。如果两人不同的话,他们再次发生碰撞的可能性很小。因此,与其在冲突后进行SHA,不如再次进行MD5,并添加一些应该更快的内容。

从你的提问方式来看,你似乎不需要安全级别的哈希算法。如果您已经传达了您试图实现的所有主要要求,那么您可能根本不需要哈希算法。

如果您正在构建一个名为unique的方法,该方法返回布尔值true,当且仅当两行是唯一的时,您可以通过按此顺序使用以下三行特性来提高速度并保持可靠性。

  • 长度(如果不是固定长度的记录)
  • 校验和
  • 实际价值

如果记录长度是可变的,那么第一个可能已经知道了。第二个可以在存储时快速计算。有了10亿条记录,即使你使用安全级别的哈希算法(你说这些算法太慢了),你也必须考虑冲突的可能性。因此,当校验和匹配时(如果校验和中有足够的位数,则这种情况很少见),您必须逐个字节比较实际值。