【问题标题】:Hashing to derive unique IDs散列以派生唯一 ID
【发布时间】:2019-10-08 16:34:33
【问题描述】:

在数据集中,散列观察(一行)的两个属性的唯一 ID 是否是为观察创建唯一 ID 的正确方法,因为该观察的唯一性来自所述属性的共现?

数据示例如下:

   scenario_id  procedure_spvid
0         2986           114374
1         2986           114660
2         2986           128564
3         2986           125072

scenario_id:
  min, max: 25, 5100306
  count unique: 2629
procedure_spvid:
  min, max: 2, 9000057
  count unique: 1163

但是,ID 不是连续的,即没有 5,100,306 个场景。

我在 Python 中对数据集所做的是:

hex(hash((scenario_id,procedure_spvid)))

【问题讨论】:

  • 一般来说,“散列”和“唯一”是不兼容的。总是有重复的可能性,无论多么小。我不能说您的特定情况是否是该规则的例外。您需要提供一个更具体的示例。包括您的 ID 的大小和 ID 的数量,以及散列的范围。
  • 是的,我认为可能存在重复。我用统计数据更新了我的问题。如果您可以分享我如何确定哈希是否唯一的基础知识,非常感谢。或者也许另一种方法更好。
  • 你在用哈希做什么?使用(scenario_id,procedure_spvid) 元组可能会更好
  • 我的最终目标是标记重复的观察结果(行)。有关scenario_id 和procedure_spvid 的重复项。我还不想只删除重复项。我需要向利益相关者展示数据的当前状态,并且为每个唯一的场景-过程对设置一个唯一的 ID 可能会有所帮助。
  • 如果您需要隐藏 (s,p) 对的值,并且您想使用函数而不是 (id,s,p) 表,您会想知道什么是伪随机排列 (PRP) 是。

标签: python hash unique-id


【解决方案1】:

哈希的目的不是保证唯一性,而是在您需要的“证明”大于您必须存储它的空间时提供合理的唯一性概率

唯一真正存储唯一一对(sid, pid)的唯一方法是通过字符串、元组等将它们相互嫁接。但是如果sidpid如果每个都是 4 个字节,那么您至少需要 8 个字节才能做到这一点。如果您只想使用 4 个字节,则可以使用 (sid, pid) 的 4 字节散列 - 但因为您将超过 4 个字节的可能选项装入仅 4 个字节,所以存在一定的重复可能性。在数学上,这被称为pigeonhole principle

如果您使用的是数据库,则可能有一种方法可以指定包含两列的compound key,以便它们一起为该行的其余部分提供主键。如果您使用正确语言的哈希表(例如 python dict),那么该数据结构将跟踪重复的哈希并适应它们,以便它们不会返回相同的值。

如果您使用哈希并自己管理它,那么您必须接受冲突的可能性。

如果没有特别查看您的数据集,我们无法真正解决为什么您可能会看到重复的哈希值。

【讨论】:

  • 如果通过嫁接你的意思是连接成一个字符串,那么我的想法是它可能会创建两个相同的 ID,例如 [12,3]=123 和 [1,23] =123。作为一个元组,它看起来像'12,3'吗?我希望有一个没有逗号的更标准的格式。
  • 连接是一种方法。简单地将整数字节彼此相邻放置(例如,从两个 4 字节整数中形成一个 8 字节整数)将是另一回事,尽管这将是特定于语言的事情。理想情况下,您会将其存储为 2 元组,就像它已经存储的方式一样,否则,使用单个分隔符进行字符串连接应该可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多