Ent*_*vel 4 c# hash md5 cryptography sha256
我正在尝试找到可能比 SHA256 更快的东西。我有超过 10 亿条记录需要散列并验证它们是否唯一。我目前正在通过 MD5 运行它,它看起来很快,然后通过 sha256 以避免冲突。按照这个顺序运行它们似乎给了我一点性能提升,但我仍然需要它更快。我正在寻找在 c# 或一些伪代码中完成的一些哈希的名称或示例,以便我可以在 c# 中重新创建它。
这里的答案中有很多可疑的信息。您用cryptography
加密哈希函数标记了您的问题,但仅提及加密哈希函数,但听起来您并不真正需要加密安全,特别是因为您说:
我有超过 10 亿条记录需要散列并验证它们是否唯一。
加密哈希函数有四个属性:
- 很容易计算任何给定消息的哈希值
- 生成具有给定散列的消息是不可行的
- 在不改变散列的情况下修改消息是不可行的
- 找到两个具有相同散列的不同消息是不可行的。
您真的只对第一个质量感兴趣,而唯一性是较小规模的要求,仅与密码安全的其他三个属性部分相关。
加密安全性存在开销。你不需要它,而且你对速度感兴趣,那么为什么不跳过它呢?MD5 和 SHA 系列的哈希宽度对于您的目的来说无疑足够大。
查看维基百科上的哈希函数列表,或查看关于普通哈希函数的文章。更重要的是,内置的 .NET 散列函数有什么问题?您是否尝试过仅遵循该Object.GetHashCode()
方法?那个 MSDN 参考有很多关于使用散列函数的内容。您对散列的数据没有说太多,因此很难说输出在您的对象之间是否是唯一的。你如何将对象送入 MD5 哈希器?我想你正在采用它的二进制表示。类似的方法可用于使用内置的非加密哈希函数。
您可能会担心内置散列函数的唯一性。它们只返回一个常规的 int,即 2^32,仅比您正在使用的数据集大 4 倍左右。但是,您始终需要为哈希函数制定备份计划。碰撞是不可行的,并非不可能。标准回退是执行更昂贵的比较,通常是参考比较和字段值比较。
如果您不准备对哈希输出进行精确比较,那么您基本上是在倒计时,直到得到误报。这对你来说可能没什么大不了的:只有你才能判断有什么缺点。
此外,执行另一个哈希函数计算可能不会比直接比较快多少。从各方面来看,你最好还是去做确定的事情并进行冗长的、直接的比较。
另一种常见的防冲突技术是使用多个密钥。所以如果你的数据点有几个大的子组件,你可以独立地散列和比较。如果它有一些大的和一些小的组件(比如一些简单的数字类型),你可以对大的进行散列并对小的进行直接比较。如果他们有一些易于取序数的数据(比如字符串的长度或某些容器的大小),您可以对这些位执行直接比较。
如果这对您不起作用,请查看 wiki 上列出的其他哈希函数的实现。这是MurmerHash3的一个很好的参考,它可以计算 32 位或 128 位哈希值。列表中还有其他散列函数,它们也具有长散列宽度,并且还有可用的 C# 库。但正如该参考资料所指出的,Murmurhash 比 MD5 和 SHA 函数快得多,尽管它没有与我上面提到的 Object.GetHashCode 方法进行直接比较。