做了几年开发,一直不理解HASH算法的原理,今天偶从百度知道上看到一个牛人神一样的理解:
这个问题有点难度,不是很好说清楚。 我来做一个比喻吧。 我们有很多的小猪,每个的体重都不一样,假设体重分布比较平均(我们考虑到公斤级别),我们按照体重来分,划分成100个小猪圈。 然后把每个小猪,按照体重赶进各自的猪圈里,记录档案。 好了,如果我们要找某个小猪怎么办呢?我们需要每个猪圈,每个小猪的比对吗? 当然不需要了。 我们先看看要找的这个小猪的体重,然后就找到了对应的猪圈了。 在这个猪圈里的小猪的数量就相对很少了。 我们在这个猪圈里就可以相对快的找到我们要找到的那个小猪了。 对应于hash算法。 就是按照hashcode分配不同的猪圈,将hashcode相同的猪放到一个猪圈里。 查找的时候,先找到hashcode对应的猪圈,然后在逐个比较里面的小猪。 所以问题的关键就是建造多少个猪圈比较合适。 如果每个小猪的体重全部不同(考虑到毫克级别),每个都建一个猪圈,那么我们可以最快速度的找到这头猪。缺点就是,建造那么多猪圈的费用有点太高了。 如果我们按照10公斤级别进行划分,那么建造的猪圈只有几个吧,那么每个圈里的小猪就很多了。我们虽然可以很快的找到猪圈,但从这个猪圈里逐个确定那头小猪也是很累的。 所以,好的hashcode,可以根据实际情况,根据具体的需求,在时间成本(更多的猪圈,更快的速度)和空间本(更少的猪圈,更低的空间需求)之间平衡。
例子很贴切、也很浅显易懂,但不够全面。
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值.也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系
例如字符串 hello的哈希算法
char* value = "hello"; int key = (((((((27*(int)‘h‘+27)* (int)‘e‘) + 27) * (int)‘l‘) + 27) *(int)‘l‘ +27) * 27 ) + (int)‘o‘ ;。
下边再来说一下HASH表(哈希表),哈希表作为一种数据结构,有着查询快、操作容易等特性,这点可以区别于数组和链表,数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。哈希表弥补了二者的不足,哈希表有多种不同的实现方法,为了让大家更容易理解,这里详细介绍下一种比较常用的方法:拉链法,我们可以理解为用一个线性数组来做寻址,数组中的元素为一个链表结构,用作元素集合(插入、删除等),这样便可以做到了寻址、插入、删除的快速操作,下面用一张图表示下:
文章只是做一个简单的介绍,让大家更容易理解什么是哈希算法,算是抛砖引玉吧,如果有不对的地方,欢迎大家指正。