python - 散列以派生唯一 ID
问题描述
在数据集中,散列观察(一行)的两个属性的唯一 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)))
解决方案
哈希的目的不是保证唯一性,而是在您需要的“证明”大于您必须存储它的空间时提供合理的唯一性概率。
存储唯一对的唯一真正(sid, pid)
独特的方法是通过字符串、元组等将它们相互嫁接。但是如果sid
每个pid
都是 4 个字节,那么您至少需要 8 个字节才能做到这一点. 如果您只想使用 4 个字节,则可以使用 4 字节的哈希(sid, pid)
- 但因为您将超过 4 个字节的可能选项装入仅 4 个字节,所以存在一定的重复可能性。在数学上,这被称为鸽巢原理。
如果您使用的是数据库,则可能有一种方法可以指定包含两列的复合键,以便它们一起为行的其余部分提供主键。如果您使用正确语言的哈希表(例如 python dict
),那么该数据结构将跟踪重复的哈希并适应它们,以便它们不会返回相同的值。
如果您使用哈希并自己管理它,那么您必须接受冲突的可能性。
但是,如果没有特别查看您的数据集,我们无法真正解决您可能会看到重复哈希的原因。
推荐阅读
- java - 我应该如何使用 keycloak.security-constraints 中的参数制作模式
- php - PHP - 如何通过递归获取所有孩子?
- python - Django 表单包含来自相关名称的 Many2Many 字段
- php - 为什么我的 laravel 应用程序的 dockerfile 不起作用?
- python-2.7 - 如何点击登录按钮
- python-3.x - Flask:获取过滤器的上下文
- ios - 如何检测到部分代码与 ios 版本不匹配?
- google-cloud-platform - 我对 Google Cloud Platform DataFusion 产品有疑问
- c# - 客户端证书在 xamarin.android 中不起作用
- php - 如何使用证书访问服务