Hash 如果我对字符串使用复合散列策略,我可以消除冲突吗?

Hash 如果我对字符串使用复合散列策略,我可以消除冲突吗?,hash,Hash,好的,下面是用例。我有很多有点长(200-500个字符)的字符串,我希望有一个较小的确定性哈希。因为我可以在仅仅20个字节内存储完整的160位SHA1值,这将使每个字符串的空间提高一个数量级 但是,当然,人们必须担心字符串上的哈希冲突,即使使用具有良好雪崩效果的加密哈希也是如此。我知道机会非常小,但我想更保守一些。如果我这样做: 散列(输入)=CONCAT(HF1(输入)、HF2(输入)) 其中,HF1是一些合适的健壮散列f(),而HF2是另一个不同但健壮的散列f()。这是否有效地使碰撞几乎不可

好的,下面是用例。我有很多有点长(200-500个字符)的字符串,我希望有一个较小的确定性哈希。因为我可以在仅仅20个字节内存储完整的160位SHA1值,这将使每个字符串的空间提高一个数量级

但是,当然,人们必须担心字符串上的哈希冲突,即使使用具有良好雪崩效果的加密哈希也是如此。我知道机会非常小,但我想更保守一些。如果我这样做:

散列(输入)=CONCAT(HF1(输入)、HF2(输入))

其中,
HF1
是一些合适的健壮散列f(),而
HF2
是另一个不同但健壮的散列f()。这是否有效地使碰撞几乎不可能发生(现在以40字节而不是20字节为代价)? 注意:对于我的用例,我不关心SHA-1的安全/加密含义

澄清:最初的问题是对连接的散列值进行散列,而不是连接不会改变外部散列函数的散列冲突概率的散列。

假设“合理”的散列函数,那么通过连接,您所做的就是创建具有更大输出空间的散列函数。是的,这降低了碰撞的概率

但不管怎样,这可能都不值得担心。2^320相当于宇宙中粒子的数量。因此,如果您预期会有攻击者,您只需担心。

假设哈希函数是“合理的”,那么通过连接,您所做的只是创建一个具有更大输出空间的哈希函数。是的,这降低了碰撞的概率


但不管怎样,这可能都不值得担心。2^320相当于宇宙中粒子的数量。所以你只需要担心是否会有攻击者。

一开始我问错了问题。这可能是我一直在寻找的问题:

这也很有启发性


我想问一下我是否有两个串联大小小于20字节的散列函数是公平的,比如说两个不同的32位散列函数。如果将这些连接起来,产生的概率很小,在实践中可以忽略,因为其中2个(甚至3个)连接起来的概率比SHA-1小。

一开始我问了一个错误的问题。这可能是我一直在寻找的问题:

这也很有启发性



我想问一下我是否有两个串联大小小于20字节的散列函数是公平的,比如说两个不同的32位散列函数。如果将这些值串联起来产生的概率很小,在实践中可以忽略,因为其中2个(甚至3个)值比SHA-1值小。

@Oli:如果我将两个哈希值串联起来(在过程中丢失一些空间),会怎么样?还是没用吗?@Matt:为了让问题更清楚,编辑了原始问题。考虑到SHA-x的设计可以很好地分发“任何”输入。。我不知道预哈希会带来什么好处。也就是说,更改SHA-x输入中的单个位将显著更改输出。(如果有什么不同的话,我可以想象,如果由于没有SHA-x那样“健壮”或以其他方式压缩输入空间而有意或无意地利用预哈希,那么预哈希将是有害的。)
CONCAT(SHA(x),SHA(f(x))
,其中
f
是一些改变输入但不会崩溃的函数(例如,反向),将导致更大的输出空间,是的。这有关系吗?我不知道,但非常怀疑。@pst:看看实际的概率,我现在确信,这种可能性非常小,担心起来很愚蠢。@Oli:如果我连接两个哈希(在过程中丢失一些空间),会怎么样?还是没有帮助?@Matt:编辑了原始问题以使其更清楚。考虑到SHA-x的设计可以很好地分配“任何”输入。我不认为预哈希会带来什么好处。也就是说,对SHA-x输入中的一个位进行更改将显著改变输出。(如果有什么不同的话,我可以想象,如果由于没有SHA-x那样“健壮”或以其他方式压缩输入空间而有意或无意地利用预哈希,那么预哈希将是有害的。)
CONCAT(SHA(x),SHA(f(x))
,其中
f
是一些改变输入但不会崩溃的函数(例如,反向),将导致更大的输出空间,是的。这有关系吗?我不知道,但非常怀疑。@pst:看看实际的概率,我现在确信,这种可能性非常小,担心起来很愚蠢。如果我在同一个字符串上串联两个不同的哈希,会怎么样?两个不同的哈希f()的概率不是真的吗对于给定的字符串,s产生相同值的概率小于它们中只有一个产生相同值的概率?@omnisis:假设它们是合理的独立散列,是的,这是真的。但是在你的问题中,你将把这个结果传递给另一个散列函数。@omnisis:嗯,你现在完全改变了这个问题。显然,更长的时间sh函数比较短的散列函数(假设它们都是“合理的”)更不可能看到冲突。是的,对此很抱歉。还有一个…我应该关心对至少一个散列使用类似加密的散列函数,还是我可以“逃脱”使用2个更小的函数?@omnisis:我不知道,但我怀疑这是否重要!不管怎样,碰撞的概率是1/2^160,这比宇宙中粒子的数量大几个数量级…如果我在同一个字符串上连接两个不同的散列会怎么样?两个不同散列f()的概率不是真的吗s为给定字符串生成相同值的概率小于它们中只有一个执行相同操作的概率?@omnisis:假设它们是合理的独立散列