为简单起见,我的问题是:如何尽快散列字符串(大约200个字符)。安全性并不重要,但碰撞是一件大事。
注意:经过快速调查后,似乎MurmurHash3可能是最佳选择。我愿意接受任何评论,否则就是
首先,我知道还有很多其他类似问题,但我还没有找到令人信服的答案。
我有一个对象列表,每个对象都包含一个大约3k段的列表,这些段落保存到数据库中。每隔X小时,这些段落就会被重新生成,我需要查找是否有任何段落发生变化,如果是,则只推送那些新段落。
我发现找到差异的最快方式(知道大部分时间内容都相同)是创建MerkleTree,将其保存到数据库,然后迭代MerkleTree以找出差异而不是比较段落本身。
这意味着,在我的情况下,我将每秒创建数万个哈希值,以与数据库中的内容进行比较。因此,我需要一种非常有效的方法来创建这些哈希。我不关心安全性,我只需要确保碰撞的数量仍然非常低。
Java中可用的最佳算法是什么?
在我的例子中,主要对象由Sections组成,Sections由Speages组成,由Paragraph组成。比较策略是:
1)如果对象散列相同,则停止,否则转到2)
2)循环所有部分,只保留具有不同散列的部分
3)循环使用这些章节的所有语言,只保留具有不同哈希值的语言
4)循环所有这些语言的所有段落,如果哈希值不同,则推送新内容。
答案 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的答案,顺便提一下,它是整个网站上第二高的投票答案。
其他一些想法: