【问题标题】:How to generate unique hash values?如何生成唯一的哈希值?
【发布时间】:2016-08-26 11:53:49
【问题描述】:

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

我正在考虑的另一种方法是将 20 个字段散列到一个字段中,并将散列与之前所有记录的散列进行比较。为此,我需要一个哈希函数来赋予我唯一性。我知道有 SHA512、SHA224 等函数。哪个哈希函数适合我的用例?

问候,
亚什

【问题讨论】:

  • 任何哈希函数都会产生冲突,你应该使用哈希集或类似的东西
  • 一目了然,SHA-256 或类似的应该可以。 20个字段是什么?整数?字符串?如果是字符串,平均长度?
  • 尽可能好和强大,没有散列函数可以保证唯一性。您可以采取最好的方法,并将其与另一种方法结合起来,采用完全不同的方法来缩小碰撞的可能性,但理论上仍然可行。
  • 为什么是 20 个字段?表没有主键?
  • 如果目标是设定完全平等,为什么不只是平等呢?

标签: java hash


【解决方案1】:

您所追求的是“perfect hashing”。有一种经典的方法,您可以分两步构造散列函数,即通过组合两个散列函数。构造有些复杂,但您可能想研究一下。

【讨论】:

  • 您还可以使用两步方法:使用一个哈希函数检查重复记录,然后使用另一个哈希函数或对所有检测到的重复项进行实际比较,以验证它们是否是真正的重复项,然后没有哈希冲突。
  • @FlorianLink ...这就是哈希表的典型实现方式,也就是说,只要您不仅仅依赖于哈希,但还要检查原始数据的相等性。
【解决方案2】:

我之前也解决过类似的问题,但规模不大,但我会分享我的经验,希望对您有所帮助。这是一个简单的解决方案,由于您使用 java 标签发布了此内容,因此我假设您了解基础知识。 解决方案将分为 3 个部分:

  1. 将 20 个参数连接成一个长字符串,以使用 java.lang.String 类的 hash 方法计算一个简单的散列。
  2. 通过选择适当的分隔符(例如制表符、换行符、回车符,甚至可能是不太可能存在于记录中的唯一长字符串)来消除预期的冲突。示例:“Stack Exchange 中不太可能存在字符串答案 1234abcd”。你可以让它有整数,字符串,你最喜欢的报价,你想要的任何东西。使用分隔符连接 te 20 个字段。此步骤需要了解您在这 20 个字段中看到的数据,如果它们都是整数,那么像“a”这样的简单字符就可以正常工作。
  3. 将记录的哈希值一一计算并存储在 HashSet 中。这样,对于每条新记录,您都可以检查您之前是否看过它并删除它或对它采取任何您想要采取的措施。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2013-07-29
    • 2017-04-09
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多