哈希值的算术运算

时间:2019-08-29 10:27:23

标签: algorithm hash

是否存在通过算术运算关闭的哈希算法?更具体地说,如果ab是两个整数,是否存在满足以下条件的任何哈希算法hashhash(a + b) == hash(a) + hash(b)(对于-,{{1 }},*)?是否可以通过某种方式修改这些运算符以实现此条件?

2 个答案:

答案 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终结器。

对于哈希和运算符的某些组合,它更容易实现,例如乘法哈希是线性的,因此它已经分布在加法和减法上。