Algorithm 互补散列函数

Algorithm 互补散列函数,algorithm,hash,Algorithm,Hash,是否存在满足以下等式的哈希类型: 散列(散列(X)+Y)=散列(X+Y) 上下文: 我正在使用一个只能附加的数据库,它必须跨领域同步。 为了保证同步按预期进行,我们对两个数据库进行哈希并进行比较。 由于数据库有点庞大,我们使用的哈希函数需要花费大量的时间来计算。所以我想知道:如果我已经有了给定数据X的散列,以及新数据Y,如果我可以只散列Y并“合并”散列,我可以节省很多时间…给定一个模数M,我们可以取散列(X)=X mod M。然后 Hash(Hash(X) + Y) = ((X mod M) +

是否存在满足以下等式的哈希类型:

散列(散列(X)+Y)=散列(X+Y)

上下文:
我正在使用一个只能附加的数据库,它必须跨领域同步。
为了保证同步按预期进行,我们对两个数据库进行哈希并进行比较。

由于数据库有点庞大,我们使用的哈希函数需要花费大量的时间来计算。所以我想知道:如果我已经有了给定数据X的散列,以及新数据Y,如果我可以只散列Y并“合并”散列,我可以节省很多时间…

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

Hash(Hash(X) + Y) = ((X mod M) + Y) mod M = (X + Y) mod M = Hash(X + Y).
这不是一个很好的散列函数,但是,与迄今为止其他关于
散列的建议不同,它并不是完全无用的

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

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

因此,
Hash
在将
X-Hash(X)
的整数倍添加到其参数时是不变的,因此在将
X-Hash(X)
G
的最大公约数的倍数添加到所有
X
时也是不变的。此外,由于
G
除以
X-散列(X)
,因此
Hash
在域
0..G-1
上是一对一的,给定模
M
,我们可以取
散列(X)=X mod M
。然后

Hash(Hash(X) + Y) = ((X mod M) + Y) mod M = (X + Y) mod M = Hash(X + Y).
这不是一个很好的散列函数,但是,与迄今为止其他关于
散列的建议不同,它并不是完全无用的

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

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

因此,
Hash
在将
X-Hash(X)
的整数倍添加到其参数时是不变的,因此在将
X-Hash(X)
G
的最大公约数的倍数添加到所有
X
时也是不变的。此外,由于
G
除以
X-散列(X)
,因此
Hash
在域
0..G-1

上是一对一的。如果“+”是串联,那么MD5、SHA1、SHA256(以及更多)几乎满足这个等式。这些散列函数的输出是它们的内部状态,因此您可以只知道散列(X)和Y来计算散列(X+Y)。此散列函数的此属性用于(在设计糟糕的加密中)。请注意,在设计加密散列函数时没有考虑此漏洞(SHA3除外)。

如果“+”是串联,则MD5、SHA1、SHA256(及更多)几乎满足此等式。这些散列函数的输出是它们的内部状态,因此您可以只知道散列(X)和Y来计算散列(X+Y)。此散列函数的此属性用于(在设计糟糕的加密中)。请注意,在设计加密散列函数时,没有考虑到此漏洞(SHA3除外)。

解决(编辑)帖子中实际问题的一种方法,以及类似于文字问题的方法,是将数据散列在方便大小的块中,其中便利性取决于数据库的大小和更新的预期大小。实际上,数据的散列是块散列的串联,遵循等式:

 HASH(x:Y) = HASH(X):HASH(Y)
其中,
是串联运算符

如果使用区块散列存储区块大小,则区块大小不必相等。当然,在这种情况下,散列函数不再是确定性的,为了进行比较,您需要块大小序列来计算更新的散列

对于确定性散列,可以使用固定的块大小,并在末尾使用单个(较短的)块;通过将最后一个块的大小预先添加到哈希序列中来组装完整的哈希。为了计算更新后的散列,有必要在截断块的开始处开始散列,这涉及到少量的重复工作,但相对来说不会太多

对于以TB为单位的数据库,合理的数据块大小可能是1GB;如果散列是128位,则散列的总大小将是每TB数据库16kb,这是相对较小的。如果TB超过您对“有点大”的预期,请适当调整块大小:)


这种技术的另一个优点是可以并行计算块散列。如果数据库更新缓存在RAM中,并行哈希可能是一个巨大的胜利。

解决(编辑)文章中实际问题的一种方法,以及类似于文字问题的方法,是将数据以方便的大小进行散列,其中方便性取决于数据库的大小和更新的预期大小。实际上,数据的散列是块散列的串联,遵循等式:

 HASH(x:Y) = HASH(X):HASH(Y)
其中,
是串联运算符

如果使用区块散列存储区块大小,则区块大小不必相等。当然,在这种情况下,散列函数不再是确定性的,为了进行比较,您需要块大小序列来计算更新的散列

对于确定性散列,可以使用固定的块大小,并在末尾使用单个(较短的)块;通过将最后一个块的大小预先添加到哈希序列中来组装完整的哈希。为了计算更新后的散列,有必要在截断块的开始处开始散列,这涉及到少量的重复工作,但相对来说不会太多

对于以TB为单位的数据库,合理的数据块大小可能是1GB;如果散列是128位,则散列的总大小将是每TB数据库16kb,这是相对较小的。如果TB超过您对“有点大”的预期,请适当调整块大小:)

这种技术的另一个优点是可以并行计算块散列。如果数据库更新缓存在RAM中