如何生成唯一的哈希值?

时间:2016-08-26 11:53:49

标签: java hash

我有10M的记录。每条记录大约有100个字段。当我读取记录时,我想确定该记录是否与我之前读过的另一条记录重复。重复检查的标准基于20个字段并检查确切的相等性。我可以记录新记录并与20个字段中的每个字段的所有先前记录进行比较。

我正在考虑的另一种方法是将20个字段散列到单个字段中,并将散列与所有先前记录的散列进行比较。为此,我需要一个哈希函数,它将给我独特性。我知道有像SHA512,SHA224等功能。哪种哈希函数适合我的用例?

的问候,
佳日

2 个答案:

答案 0 :(得分:0)

你所追求的是“perfect hashing”。有一种经典的方法,你可以分两步构造一个哈希函数,即通过组合两个哈希函数。这种结构有点牵扯,但你可能想要研究它。

答案 1 :(得分:0)

我之前没有在如此大规模的问题上解决过类似的问题,但我会分享我的经验,希望它会有所帮助。这是一个简单的解决方案,因为你使用java标签发布了这个,我假设你知道基础知识。 该解决方案将有3个部分:

  1. 将20个参数连接到一个长字符串中,使用java.lang.String类中的hash方法计算一个简单的哈希值。
  2. 通过选择适当的分隔符(例如制表符,换行符,返回值)或甚至是记录中不太可能存在的唯一长字符串来删除预期冲突。示例:"不太可能在Stack Exchange中存在的字符串答案1234abcd"。你可以使它有整数,字符串,你最喜欢的引用,你想要的任何东西。使用分隔符连接te 20个字段。这个步骤需要了解你在这20个字段中看到的数据,如果所有整数都是一个简单的字符,例如' a'会很好的。
  3. 在HashSet中逐个计算并存储记录的哈希值。这样,对于每个新记录,您可以检查您之前是否已经看过它并摆脱它或采取您想要采取的任何行动。