为了账号安全,请及时绑定邮箱和手机立即绑定

谁能给讲讲哈希码

谁能给讲讲哈希码

慕粉小蜗牛 2016-06-20 17:52:32
对哈希码一直有点困惑
查看完整描述

2 回答

已采纳
?
KFEB5

TA贡献2条经验 获得超4个赞

哈希码可以理解为数据的名字,在一大堆数据里找到某个数据,需要指定数据一个唯一的名字(重名可不好)。数据的名字可以随便起,自然用编号最好。
生成hash码的方法多种多样。核心就是唯一标识数据。
数据有了名字之后怎么使用这个名字呢?建立一个花名册,就像分配宿舍一样,一个名字后面对应一个宿舍,根据名字就可以迅速找到目标,否则就要一个个房间找过来。这比喻这基本上和hash表的原理类似。另一个更合适的比喻是字典,新华字典那种。
恩,差不多就是这样

查看完整回答
3 反对 回复 2016-06-20
  • 慕粉小蜗牛
    慕粉小蜗牛
    什么地方能用到哈希码,什么地方用不到那,比如集合list比较值就不用哈希码,hashset则用,,,能说下吗,谢谢
  • KFEB5
    KFEB5
    集合list,比较值?没有看懂。list和hashset的算法和用途是不一样的。hashset主要是为了快速的随机查找数据(随机的意思是任意的查找),比如我想知道‘钢铁’的意思,那么我就会通过钢铁的拼音规则查找字典目录,这个查找目录的过程依赖于这个目录的结构(拼音按照字母表排序规则),可以理解为hashcode的编码规则,是一种逻辑上的数据结构。 而list就没有这样的要求,可以随便线性的放置任意数据,你可以选择按序排放,但并不需要为每个对象起个名字(hashcode)。 实际上你可以仔细看一下asd8532,他提供的解释非常棒。我为了尽量让语句通俗一点,用了很多比喻,但是任何比喻都会偏离原来的本意。你用不着在我的比喻上进行拓展的想象,直接观察相关的算法可以有更加准确的认识。
?
asd8532

TA贡献143条经验 获得超187个赞

哈希算法并不是一个特定的算法而是一类算法的统称。哈希算法也叫散列算法,一般来说满足这样的关系:f(data)=key,输入任意长度的data数据,经过哈希算法处理后输出一个定长的数据key。同时这个过程是不可逆的,无法由key逆推出data。

如果是一个data数据集,经过哈希算法处理后得到key的数据集,然后将keys与原始数据进行一一映射就得到了一个哈希表。一般来说哈希表M符合M[key]=data这种形式。
哈希表的好处是当原始数据较大时,我们可以用哈希算法处理得到定长的哈希值key,那么这个key相对原始数据要小得多。我们就可以用这个较小的数据集来做索引,达到快速查找的目的。

稍微想一下就可以发现,既然输入数据不定长,而输出的哈希值却是固定长度的,这意味着哈希值是一个有限集合,而输入数据则可以是无穷多个。那么建立一对一关系明显是不现实的。所以"碰撞"(不同的输入数据对应了相同的哈希值)是必然会发生的,所以一个成熟的哈希算法会有较好的抗冲突性。同时在实现哈希表的结构时也要考虑到哈希冲突的问题。

密码上常用的MD5,SHA都是哈希算法,因为key的长度(相对大家的密码来说)较大所以碰撞空间较大,有比较好的抗碰撞性,所以常常用作密码校验。


查看完整回答
4 反对 回复 2016-06-20
  • 2 回答
  • 3 关注
  • 1909 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信