问题描述
百度百科上的解释:----- 哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。------------------------------------------------------------------------如上所说任意长度的二进制映射为固定长度的较小二进制,它是唯一的。这个应该做不到啊,比如说8bit的二进制数据再怎么映射成3bit的数据,它也肯定是有雷同的啊,求解!
解决方案
本帖最后由 plahitzxl 于 2010-04-26 09:41:40 编辑
解决方案二:
雷同的叫碰撞,这种情况是不可避免的,因为项的个数比位置要多,但是有迅速解决碰撞的方法,最简单的有:线性探测法、二次探测法、分别链接法你可以去百度一下这些方法
解决方案三:
要找到散列为同一个值的两个不同的输入,在计算上是不可能的-------是说这个是不可逆的?然后如果你企图想用一段字符来覆盖另一段字符,其哈希值必然发生改变,所以就能判断原数据是不是相同的。如果你企图找到哈希值和原数据一样的数据,这是几乎不可能的,因为它理论上是不可逆的。嗯。应该是这样,请各位指正。
解决方案四:
学习了
解决方案五:
数据结构对这有详细的描述
解决方案六:
友情帮顶
解决方案七:
引用2楼plahitzxl的回复:
要找到散列为同一个值的两个不同的输入,在计算上是不可能的-------是说这个是不可逆的?然后如果你企图想用一段字符来覆盖另一段字符,其哈希值必然发生改变,所以就能判断原数据是不是相同的。如果你企图找到哈希值和原数据一样的数据,这是几乎不可能的,因为它理论上是不可逆的。嗯。应该是这样,请各位指正。
哈希散列值相同是允许的,两个不同输入可以有相同的散列,但不用去改变谁,只要去解决碰撞就可以了jdk中关于哈希有这样的话两个对象不相等,那么对这两个对象中的任一对象上调用hashCode方法不要求一定生成不同的整数结果就是说散列的值可以相同在java.util.hashset内部,就是用散列来实现的,里面也考虑了不同输入有相同的哈希值,并提供了解决方法,它的解决方法是线性探测法,如果一个输入的值发现它的哈希已经有了,就在这个哈希的另一位置进行存储你可以看下hashset中关于散列相同的处理,你可以去看jdk源码或者到这个网站看一下