是否存在通过算术运算关闭的哈希算法?更具体地说,如果a
和b
是两个整数,是否存在满足以下条件的任何哈希算法hash
:hash(a + b) == hash(a) + hash(b)
(对于-
,{{1 }},*
)?是否可以通过某种方式修改这些运算符以实现此条件?
答案 0 :(得分:4)
假设1000 and 1001
。使用归纳法可以证明h(a+b) = h(a) + h(b)
如果h(c * a)
是常数,则等于c
。因此,这意味着函数h(c*a) = c * h(a)
必须是线性的(通过线性代数中线性映射的定义),每个线性函数(例如h
(c是整数和常数)都可以解决。您的问题。但是,它是线性的,不会有用的哈希函数!此外,您可以对h(x) = c * x
做同样的事情。
对于乘法,它可能更复杂。 -
。从此等式中可以得出,对于每个常量h(a*b) = h(a)*h(b)
,我们可以拥有m
。现在,就像您现在一样,我们可以像h(a^m) = h(a)^m
这样写每个数字,即x = p_1^a_1 * p_2^a_2 * ... * p_k^a_k
都是素数。因此,p_i
。因此,素数上h(x) = h(p_1)^a_1 * h(p_2)^a_2 * ... * h(p_k)^a_k
的值很重要,其他值将由这些值确定。
答案 1 :(得分:2)
是否可以通过某种方式修改这些运算符以实现此条件?
是:撤消哈希。因此,对于任何运算符a•b,都要计算hash(hash⁻¹(a)•hash⁻¹(b))。
这适用于任何双射散列,典型的整数散列属于该类:乘以常数,按位旋转,按常数进行XOR,添加常数,某些XOR /移位的组成。例如Murmurhash终结器。
对于哈希和运算符的某些组合,它更容易实现,例如乘法哈希是线性的,因此它已经分布在加法和减法上。