对哈希感到困惑

cha*_*hat 4 hash

说我有一个5000字符的文字.我通过散列程序运行它并生成一个40 char长的散列.现在我运行另一个文本blob,10000个字符.它仍然会产生40个字符长的哈希值.对于任何长度的文本都是如此.

我的问题是,如果哈希值都是唯一的,我不能将任何东西压缩成40个字符串吗?

Ree*_*sey 18

哈希并不是唯一的.

散列是一种尝试为每个馈送给它的值生成唯一散列的技术,但它不能保证唯一.

良好的散列算法将具有重复的散列值,其频率低于错误的散列算法.此外,散列是一个方向 - 意味着你不能从哈希 - >原始,所以它不是用于压缩.

并且:哈希不需要是唯一的.需要通过算法将相同的输入转换为相同的散列.您不使用哈希作为标识符!


pdw*_*etz 9

并非所有哈希都保证是独一无二的.关于这个主题的维基百科条目非常好:http://en.wikipedia.org/wiki/Hash_function


dbr*_*dbr 8

想到哈希的一种方法就像人类指纹(哈希有时也被称为指纹).

你可以将任何人"压缩"成一个(几乎)独特的指纹......但是,你无法通过他们的指纹单独知道是谁.这就像一个哈希,你可以很容易地解决hash("abcdef") -> a1b2c3,但只给出a1b2c3,你不能轻易告诉源数据.

要反转指纹,您需要将指纹与已知数据库进行比较people->finger-prints(如果未知指纹与Person1匹配,未知指纹属于它们)

使用哈希,你必须做同样的事情 - 你有一个包含所有字符串 - >哈希映射的数据库(称为彩虹表).然后你用哈希"a1b2c3"查找行,并显示"abcdef"被哈希以获得这个.另一种更常见的方法是简单地尝试每个字符组合,哈希并比较(蛮力攻击)

最后,虽然人类的指纹是"独一无二的",但它可能有两个相同,它只是非常不可能 - 它与散列相同......一些散列算法比其他散列算法更容易发生碰撞.

我的问题是,如果哈希值都是唯一的,我不能将任何东西压缩成40个字符串吗?

理论上散列是一种很好的压缩方法,但是解压缩超出(例如)10个ASCII字符的数据是非常不切实际的.你是对的,你可以将任何东西压缩成40个字符的字符串,但你实际上不能解压缩它(甚至理论上是有点拉伸..)

  • 不,你根本不能将它用作压缩系统.给定40个字符的散列,每个散列值将有数百万个(例如)50个字符串.碰巧找到它们中的任何一个都非常非常困难,但你无法找到"正确的". (4认同)

Yes*_*ke. 5

RSA哈希并不是唯一的.有一个极小的(大约为1:36 ^ 40)的机会,当你散列两个不同的明文时,你会产生误报.对于大多数应用来说,机会被认为足够小,你可以忽略它,因为平均而言,数百万年才能看到意外碰撞.