Hash 是否可以对完整的整数范围实现通用哈希?
我正在读关于整数的书。先决条件和强制先决条件似乎是我们选择一个大于所有可能键集的素数Hash 是否可以对完整的整数范围实现通用哈希?,hash,types,integer-hashing,Hash,Types,Integer Hashing,我正在读关于整数的书。先决条件和强制先决条件似乎是我们选择一个大于所有可能键集的素数p 这一点我不清楚 如果我们的密钥集是int类型,那么这意味着质数需要是下一个更大的数据类型,例如long 但最终,无论我们得到什么样的哈希值,都需要向下转换为int来索引哈希表。这种向下转换是否会以某种方式影响通用散列的质量(我指的是存储桶上的密钥分布) 如果我们的密钥集是整数,那么这意味着素数 需要是下一个更大的数据类型,例如long 这不是问题。有时这是必要的,否则哈希族不能是通用的。有关更多信息,请参见下
p
这一点我不清楚
如果我们的密钥集是int
类型,那么这意味着质数需要是下一个更大的数据类型,例如long
但最终,无论我们得到什么样的哈希值,都需要向下转换为int来索引哈希表。这种向下转换是否会以某种方式影响通用散列的质量(我指的是存储桶上的密钥分布)
如果我们的密钥集是整数,那么这意味着素数
需要是下一个更大的数据类型,例如long
这不是问题。有时这是必要的,否则哈希族不能是通用的。有关更多信息,请参见下文
但最终无论我们得到什么样的哈希值都需要
向下转换为int
以索引哈希表
这种向下转换不会影响通用哈希的质量吗
(我指的是钥匙在桶上的分配)
不知怎么的
答案是否定的。我会尽力解释
p
是否具有另一种数据类型对于哈希族的通用性并不重要。重要的是p
等于或大于u
(整数宇宙的最大整数)。重要的是p
足够大(即>=u
)
当碰撞概率等于或等于时,哈希族是通用的
小于1/m
因此,我们的想法是保持这种约束
理论上,p
的值可以与long
一样大或更大。它只需要是一个整数和素数
是域/范围的大小(或密钥数)。给定宇宙u
,U={0,…,U-1}
表示大小U
|U
是箱子或桶的数量m
是必须等于或大于p
n
- 散列族定义为
,其中H={H(a,b)(x)}
注意H(a,b)(x)=((a*x+b)mod p)mod m
和a
是随机选择的整数(从所有可能的整数中,因此理论上可以大于b
),模a素数p
(这可以使它们小于或大于p
,即容器/桶的数量);但这里也有数据类型(值的域并不重要)。有关符号,请参见m
- 遵循,您得出结论,碰撞概率为
(下划线表示截断小数)。对于\u p/m_*1/(p-1)
(p>>m
比p
大得多)概率趋向于m
(但这并不意味着1/m
越大概率越好)p
p
作为一个更大的数据类型在这里不是问题,甚至可能是必需的p
必须等于或大于u
,a
和b
必须是随机选择的整数模p
,无论桶数m
。通过这些约束,您可以构造一个通用哈希族
也许一个数学例子会有所帮助
- 设U是与
相对应的整数的集合(例如,在C中)。然后无符号字符
U={0,…,255}
- 让
为(下一个可能的)素数等于或大于p
注意256
可以是这些类型中的任何一种(p
,short
,int
可以是有符号的,也可以是无符号的)。关键是数据类型不起作用(在编程中,类型主要表示一个值域)。就数学证明的正确性而言,long
是257
,short
还是int
在这里并不重要。此外,我们还可以选择更大的long
(即更大的数据类型);这不会改变证据的正确性p
- 下一个可能的素数是
李>257
- 我们说我们有
桶,即25
。这意味着,如果碰撞概率等于或小于m=25
,即大约1/25
,则哈希族将是通用的0.04
- 输入小于
的0.04
:\u p/m*1/(p-1)
的值。它是一个具有选定参数的通用哈希族\u 257/25\u*1/256=10/256=0.0390625
- 下一个可能的素数是
m=u=256
bucket。那么我们的碰撞概率为0.003891050584
,小于1/256=000390625
。哈希族仍然是通用的
让我们尝试使用m
大于p
,例如m=300
。碰撞概率为0,小于1/300~=0.003333
。琐碎的,我们的桶比钥匙多。仍然是通用的,没有碰撞
实现细节示例 我们有以下几点:
类型的int
(一个x
元素)|U |
,a
,b
类型p
long
我们将在后面的示例中看到m
- 选择
,使其大于最大p
(元素u
),|u |
类型为p
long
- 随机选择
和a
(模b
)。它们属于p
l型