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
    是随机选择的整数(从所有可能的整数中,因此理论上可以大于
    p
    ),模a素数
    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型