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

Hen*_*rre 7 java hash merkle-tree

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

注意:经过快速调查,似乎MurmurHash3可能是最好的选择.我愿意接受任何评论,否则说'

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

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

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

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

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


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

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

2)循环所有Section,只保留带有不同散列的Section

3)循环这些部分的所有语言,只保留具有不同散列的语言

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

dur*_*597 5

程序员堆栈交换的这个惊人的答案告诉你所有你需要知道的.

短版本是使用FNV-1a,又称Fowler-Noll-Vo哈希函数,它具有出色的性能,高随机性和低冲突.

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

其他一些想法:

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

另请参见:文本数据的最快哈希算法

  • 如果你想一下碰撞的原因,那就相当正常了.碰撞发生在单字数据上,因此数据实际上非常紧凑并且碰撞是正常的.数据越大,碰撞越少.你说你已经完整的段落,在你拥有的前250k段上测试算法,并检查你实际上下文中的碰撞,而不是在那个人的特定上下文中. (2认同)