对于具有良好理论保证的整数集合(即多集)是否存在哈希函数?


36

我很好奇是否有一种方法可以存储具有以下属性的多组整数的哈希,理想情况下:

  1. 它使用O(1)空间
  2. 可以对其进行更新以反映O(1)时间的插入或删除
  3. 两个相同的集合(即具有相同元素且具有相同多重性的集合)应始终散列为相同的值,而两个不同的集合应以较高的概率散列为不同的值(即,函数是独立的或成对独立的)

对此的一种初步尝试是将乘积以各个元素的哈希的随机素数模存储。满足1和2,但尚不清楚它是否满足3。

我最初将此内容发布在StackOverflow上

*属性1和2可以放宽到O(log n)或小的次线性多项式。关键是要看我们是否可以识别多集合并可靠地测试相等性而无需存储元素本身。


您对多集的表示是什么?即,如何将多集编码为位字符串?如果您真的想获得操作(与多集大小无关),我认为您应该使编码明确。O(1)
Jukka Suomela

集的编码并不重要。散列函数应独立于集合的表示。如果我使用的是哈希集的规范表示形式,则该集的位表示形式上的任何标准哈希都将满足3,可能满足1,但不满足2。我应该补充一点,两个相等的集合应始终将hash哈希化为相同的值。
jonderry

2到底是什么意思?您是否获得了旧集,旧哈希码和新元素,并且想要计算新哈希码?还是只得到旧的哈希码和新的元素?
Mihai 2010年

理想情况下,您不需要旧的设置。您甚至不需要执行成员查询(重要的是,给定空间限制),只需进行相等性测试,就可能通过比较具有低误报率的哈希值来进行。
jonderry

Answers:


17

[u]O(lgu)u

h(x)=(i=1uxiai)modppa[p]iaiO(lgi)uuO(u/p)。可以通过使足够大来使其非常小(例如,并且您以“双精度”工作)。如果集合比小得多,您当然可以从将Universe哈希化为较小的Universe开始。pp=u2[u]

哈希到范围时,有人知道碰撞概率的解决方案吗?这应该是可能的。O(1/p)[p]


0

Carter和Wegman在New hash函数中介绍了这一点,以及它们在身份验证和集合相等中的用法;它与您所描述的非常相似。本质上,可交换哈希函数可以一次更新一个元素,以便在O(1)中进行插入和删除以及高概率匹配。


我认为这仅适用于集合,而不适用于多集(根据问题的要求)。从第5节的第274页底部开始:“ ADD(x,S)-将元素x添加到名为S的集合中。如果x已经是S的成员,则可能无法使用此操作。”
jbapple

你是对的; 我错过了“多”部分。哈希函数似乎可以处理重复项,尽管我没有引用它。
KWillets

-2

哈希函数的质量将始终取决于它必须哈希的元素的属性。你能说点什么吗?例如,如果多集的元素x_i通常具有许多小的素数,则您的产品建议可能是一个较差的哈希函数。但是,在这种情况下,您只需对所有素数p和q取所有x_i + p mod q的乘积即可对其进行改进。


1
是的,这就是在将各个元素相乘之前先对其进行哈希处理的原因。
jonderry 2010年

什么?OP的建议只是将它们全部相乘,不是吗?我的意思是,如果在执行此操作之前为每个变量添加一个常量,则可能会得到更好的哈希值。
TonyK

-5
A = 0x4F1BBCDD
B = 0x314EFB75
A*B = 1 
N = size of set before addition/removal<P>
Add X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U+X)&M)<<16) + ((V^X)&M)
H *= A
H += N+1

Remove X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U-X)&M)<<16) + ((V^X)&M)
H *= A
H += N-1

总和使我们可以多次出现相同的值,
而异或使我们可以让集合具有相同的值

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.