比MD5或SHA256更快地寻找C#哈希

我试图找到比SHA256更快的东西.我有超过10亿条记录需要哈希并验证它们是否是唯一的.我目前通过MD5运行它,然后通过sha256看起来相当快,以避免碰撞.按顺序运行它们似乎给了我一点性能提升,但我仍然需要它更快.我正在寻找在c#或一些伪代码中完成的一些哈希的名称或示例,因此我可以在c#中重新创建它.

解决方法:

这里的答案中有很多可疑的信息.您使用加密技术标记了您的问题并仅提及加密哈希函数,但听起来您并不真正需要加密安全性,特别是因为您说:

I have over 1 billion records I need to hash and verify if they are unique.

cryptographic hash function有四个属性:

  • it is easy to compute the hash value for any given message
  • it is infeasible to generate a message that has a given hash
  • it is infeasible to modify a message without changing the hash
  • it is infeasible to find two different messages with the same hash.

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

你为什么在乎?

加密安全性存在开销.你不需要它,你对速度感兴趣,为什么不跳过它呢? MD5和SHA系列的哈希宽度无疑是足够大的.

查看*上的hash functions列表,或查看normal hash functions上的文章.更重要的是,内置.NET哈希函数有什么问题?您是否尝试过推迟使用Object.GetHashCode()方法? MSDN参考有很多关于使用哈希函数的说法.您没有对要散列的数据说太多,因此很难说输出在对象之间是否是唯一的.你是如何将物体送入MD5的哈希?我认为你正在采用它的二进制表示.可以使用类似的方法来使用内置的非加密散列函数.

您可能会担心内置哈希函数的唯一性.它们只返回一个常规的int,即2 ^ 32,只比你正在使用的数据集大4倍.但是,您始终需要有哈希函数的备份计划.碰撞是不可行的,并非不可能.标准后备是执行更昂贵的比较,通常是参考比较和字段值比较.

如果你不准备对你的哈希输出做一个精确的比较,你基本上都会倒数,直到你得到误报.这对你来说可能不是什么大问题:只有你可以判断它的缺点是什么.

另外,执行另一个散列函数计算可能不比直接比较快得多.在所有方面,你最好还是选择坚定的事情并进行冗长的直接比较.

另一种常见的防冲突技术是使用多个键.因此,如果您的数据点有几个大的子组件,则您可以独立地进行哈希和比较.如果它有一些大的和一些小的组件(比如说一些简单的数字类型),你可以对大的组件进行哈希处理并对小组件进行直接比较.如果他们有一些容易采用序数的数据(比如字符串的长度或某些容器的大小),你可以对这些位进行直接比较.

如果这对你不起作用,请看一下wiki上列出的其他哈希函数的实现.这是一个pretty good reference for MurmerHash3,可以计算32位或128位哈希值.列表中还有其他哈希函数,它们具有较长的哈希宽度,并且还具有可用的C#库.但正如该引用所指出的,Murmurhash比MD5和SHA函数更快,尽管它没有直接比较我上面提到的Object.GetHashCode方法.

上一篇:对两个N进制字符串求和


下一篇:Post请求接口,参数以json方式,SHA256计算加密