与级联同态的非加密散列函数
Non-cryptographic hash functions that are homomorphic with respect to concatenation
Adler32 和 CRC 具有 属性,即 f(a || b)
可以是 computed inexpensively 来自 f(a)
、f(b)
和 len(b)
。这个 属性 是否还有其他常见的非加密哈希函数?
上下文(为了避免 XY 问题)是我通过将字符串分成块来对字符串进行重复数据删除,这些块由它们的哈希索引。然后可以将输入字符串表示为一系列串联的块。我想使用一个散列函数,这样一个字符串的所有表示都具有相同的散列,可以直接从块散列计算而不需要底层数据,因为它以未指定的顺序流式传输,因此可能不可用任何时候都在同一个地方。
我的设计需要大约 2^32 个块。冲突 非常 昂贵,但不会损害正确性。基于此,我 认为 CRC64 可以工作,但我很好奇我的替代方案是什么。我不介意 128 位散列用于未来验证(如:数据集大小可能会增长)。
你的 232 64 位 CRC 的所有对中发生一次冲突的概率约为 1/2。如果这对您来说太高,您可以使用 128 位 CRC。这将一次碰撞的概率降低到 3x10-20.
Adler32 和 CRC 具有 属性,即 f(a || b)
可以是 computed inexpensively 来自 f(a)
、f(b)
和 len(b)
。这个 属性 是否还有其他常见的非加密哈希函数?
上下文(为了避免 XY 问题)是我通过将字符串分成块来对字符串进行重复数据删除,这些块由它们的哈希索引。然后可以将输入字符串表示为一系列串联的块。我想使用一个散列函数,这样一个字符串的所有表示都具有相同的散列,可以直接从块散列计算而不需要底层数据,因为它以未指定的顺序流式传输,因此可能不可用任何时候都在同一个地方。
我的设计需要大约 2^32 个块。冲突 非常 昂贵,但不会损害正确性。基于此,我 认为 CRC64 可以工作,但我很好奇我的替代方案是什么。我不介意 128 位散列用于未来验证(如:数据集大小可能会增长)。
你的 232 64 位 CRC 的所有对中发生一次冲突的概率约为 1/2。如果这对您来说太高,您可以使用 128 位 CRC。这将一次碰撞的概率降低到 3x10-20.