algorithm - 互补哈希函数

标签 algorithm hash

是否存在一种满足以下等式的哈希:

Hash(Hash(X)+Y) = Hash(X+Y)

上下文:
我正在使用必须跨领域同步的仅附加数据库。
为了保证同步按预期发生,我们对两个数据库进行哈希处理并进行比较。
由于数据库有点庞大,我们使用的哈希函数需要花费大量宝贵的时间来计算。所以我想知道:如果我已经有了给定数据 X 和新数据 Y 的散列,如果我可以只散列 Y 并“合并”散列,我可以节省很多时间......

最佳答案

给定一个模 M,我们可以取 Hash(X) = X mod M。然后

Hash(Hash(X) + Y) = ((X mod M) + Y) mod M = (X + Y) mod M = Hash(X + Y).

这不是一个很好的散列函数,但是,与目前针对 Hash 的其他建议不同,它并非完全无用。

它本质上也是唯一的建议,因为通过替换 Y = Z - Hash(X),我们得到

Hash(Z) = Hash(Z + (X - Hash(X))),

因此 Hash 在将 X - Hash(X) 的整数倍添加到其参数下不变,因此在将 G 的最大公约数的倍数添加下保持不变 of X - Hash(X) for all X。此外,由于 G 划分 X - Hash(X),因此 Hash 在域 0 上是一对一的..G-1.

关于algorithm - 互补哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26235947/

相关文章:

java - 乘法和除法是 O(1) 在最常用的计算机体系结构上实现的方式吗?

c - 使用有限的操作尽快对大数字列表(100k)进行排序

算法:按预期频率将符号压缩成位串?

java - 使用 char[] 生成 MD5 哈希

algorithm - 平台游戏 - 一种逼真的寻路算法

java:在二维数组中搜索最小值并返回最小值的位置(行和列)

javascript - 为什么 javascript 中的 `btoa` 编码适用于 20 位字符串而不是 20 位 int?

PHP password_verify 错误地返回 false

javascript - 为什么我们需要在哈希导航 URL 中使用感叹号?

hash - 两个不同的字符串可以生成相同的MD5哈希码吗?