用于字符串的最快哈希算法

时间:2015-08-04 18:38:49

标签: java hash merkle-tree

为简单起见,我的问题是:如何尽快散列字符串(大约200个字符)。安全性并不重要,但碰撞是一件大事。

注意:经过快速调查后,似乎MurmurHash3可能是最佳选择。我愿意接受任何评论,否则就是

首先,我知道还有很多其他类似问题,但我还没有找到令人信服的答案。

我有一个对象列表,每个对象都包含一个大约3k段的列表,这些段落保存到数据库中。每隔X小时,这些段落就会被重新生成,我需要查找是否有任何段落发生变化,如果是,则只推送那些新段落。

我发现找到差异的最快方式(知道大部分时间内容都相同)是创建MerkleTree,将其保存到数据库,然后迭代MerkleTree以找出差异而不是比较段落本身。

这意味着,在我的情况下,我将每秒创建数万个哈希值,以与数据库中的内容进行比较。因此,我需要一种非常有效的方法来创建这些哈希。我不关心安全性,我只需要确保碰撞的数量仍然非常低。

Java中可用的最佳算法是什么?

在我的例子中,主要对象由Sections组成,Sections由Speages组成,由Paragraph组成。比较策略是:

1)如果对象散列相同,则停止,否则转到2)

2)循环所有部分,只保留具有不同散列的部分

3)循环使用这些章节的所有语言,只保留具有不同哈希值的语言

4)循环所有这些语言的所有段落,如果哈希值不同,则推送新内容。

1 个答案:

答案 0 :(得分:5)

This amazing answer on Programmers Stack Exchange tells you all you need to know.

短版本是使用FNV-1a, aka the Fowler–Noll–Vo hash function,它具有出色的性能,高随机性和低冲突。

我对这个问题的任何进一步解释都只是复制并粘贴来自Programmers.SE的答案,顺便提一下,它是整个网站上第二高的投票答案。

其他一些想法:

  • 最终,你有一个非常小众的用例。大多数人并没有定期处理10亿个入门数据集。因此,您可能必须进行自己的基准测试。
  • 也就是说,具有高随机性表明该算法很可能适用于英语哈希。
  • 你还没有真正谈过其他问题;你能将整个数据集保存在内存中吗?您的足迹要求是什么?

另请参阅:Fastest Hash Algorithm for Text Data