我试图找到比SHA256更快的东西。我有超过10亿条记录需要哈希并验证它们是否是唯一的。我目前通过MD5运行它,然后通过sha256看起来相当快,以避免碰撞。按顺序运行它们似乎给了我一点性能提升,但我仍然需要它更快。我正在寻找在c#或一些伪代码中完成的一些哈希的名称或示例,因此我可以在c#中重新创建它。
答案 0 :(得分:3)
这里的答案中有很多可疑的信息。您使用cryptography
标记了您的问题并仅提及加密哈希函数,但听起来您并不真正需要加密安全性,特别是因为您说:
我有超过10亿条记录需要哈希并验证它们是否是唯一的。
cryptographic hash function有四个属性:
- 很容易计算任何给定消息的哈希值
- 生成具有给定哈希值的消息
是不可行的- 修改邮件而不更改哈希
是不可行的- 找到具有相同哈希值的两个不同消息是不可行的。
您真的只对第一个质量感兴趣,而且唯一性是一个较小的规模要求,只与加密安全的其他三个属性部分相关。
加密安全性存在开销。你不需要它,你对速度感兴趣,为什么不跳过它呢? 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方法。
答案 1 :(得分:2)
做些不同的事情呢?
在每条记录上使用一个简单的散列函数,就像将记录插入哈希表时使用的那样,也许将每条记录映射到32位INT。然后,如果存在哈希冲突,则将碰撞记录与唯一性进行比较。
答案 2 :(得分:1)
您可以使用MD5然后如果遇到碰撞记录,可以使用SHA256甚至SHA128进行检查。
答案 3 :(得分:1)
您是否使用sha256检查每个记录?您只需要检查有md5冲突的记录,即使使用md5也应该很少。此时,当您只是比较重复项时,将原始记录与原始记录进行比较可能会更快,因为比较将返回第一个差异。
答案 4 :(得分:0)
您甚至可以执行类似于MD5的操作,如果发生碰撞,请为这两个值添加一些额外数据(相同)并再次使用MD5。如果两者不同,那么它们不太可能再次发生碰撞。因此,在碰撞后不再使用SHA,而是在添加了更快的内容的情况下再次执行MD5。
答案 5 :(得分:0)
https://github.com/noricube/xxHashSharp 具有最快的散列算法,但它不适合加密。
答案 6 :(得分:0)
从您提出问题的方式来看,您似乎不需要安全等级哈希算法。如果您已经传达了您要完成的所有主要要求,则可能根本不需要哈希算法。
如果要构造一个名为unique的方法,当且仅当两行是唯一的时,才返回布尔值true,您可以通过按此顺序使用以下三行特征来获得速度并保持可靠性。
如果记录长度可变,则可能已知第一个。第二个可以在存储时快速计算。拥有十亿条记录,即使你使用安全级别的哈希算法(你说这些算法太慢了),你也必须承担冲突的可能性。因此,当校验和匹配时,如果校验和中有足够的位数,这将是罕见的,您将不得不覆盖逐字节比较实际值的情况。