Ree*_*sey 18
哈希并不是唯一的.
散列是一种尝试为每个馈送给它的值生成唯一散列的技术,但它不能保证唯一.
良好的散列算法将具有重复的散列值,其频率低于错误的散列算法.此外,散列是一个方向 - 意味着你不能从哈希 - >原始,所以它不是用于压缩.
并且:哈希不需要是唯一的.需要通过算法将相同的输入转换为相同的散列.您不使用哈希作为标识符!
想到哈希的一种方法就像人类指纹(哈希有时也被称为指纹).
你可以将任何人"压缩"成一个(几乎)独特的指纹......但是,你无法通过他们的指纹单独知道是谁.这就像一个哈希,你可以很容易地解决hash("abcdef") -> a1b2c3
,但只给出a1b2c3
,你不能轻易告诉源数据.
要反转指纹,您需要将指纹与已知数据库进行比较people->finger-prints
(如果未知指纹与Person1匹配,未知指纹属于它们)
使用哈希,你必须做同样的事情 - 你有一个包含所有字符串 - >哈希映射的数据库(称为彩虹表).然后你用哈希"a1b2c3"查找行,并显示"abcdef"被哈希以获得这个.另一种更常见的方法是简单地尝试每个字符组合,哈希并比较(蛮力攻击)
最后,虽然人类的指纹是"独一无二的",但它可能有两个相同,它只是非常不可能 - 它与散列相同......一些散列算法比其他散列算法更容易发生碰撞.
我的问题是,如果哈希值都是唯一的,我不能将任何东西压缩成40个字符串吗?
理论上散列是一种很好的压缩方法,但是解压缩超出(例如)10个ASCII字符的数据是非常不切实际的.你是对的,你可以将任何东西压缩成40个字符的字符串,但你实际上不能解压缩它(甚至理论上是有点拉伸..)
RSA哈希并不是唯一的.有一个极小的(大约为1:36 ^ 40)的机会,当你散列两个不同的明文时,你会产生误报.对于大多数应用来说,机会被认为足够小,你可以忽略它,因为平均而言,数百万年才能看到意外碰撞.