via:什么是哈希表和哈希算法?
比如这里有一万首歌,给你一首新的歌X,要求你确认这首歌是否在那一万首歌之内。
无疑,将一万首歌一个一个比对非常慢。但如果存在一种方式,能将一万首歌的每首数据浓缩到一个数字(称为哈希码)中,于是得到一万个数字,那么用同样的算法计算新的歌X的编码,看看歌X的编码是否在之前那一万个数字中,就能知道歌X是否在那一万首歌中。
作为例子,如果要你组织那一万首歌,一个简单的哈希算法就是让歌曲所占硬盘的字节数作为哈希码。这样的话,你可以让一万首歌“按照大小排序”,然后遇到一首新的歌,只要看看新的歌的字节数是否和已有的一万首歌中的某一首的字节数相同,就知道新的歌是否在那一万首歌之内了。
当然这个简单的哈希算法很容易出现两者同样大小的歌曲,这就是发送了碰撞。而好的哈希算法发生碰撞的几率非常小。
首先,弄个函数,把你的key算成一个数,让不同的key得到的数尽量不一样。这个函数就叫hash函数。举个实例:字符串里面各个字符的异或值。这就是一个比较简单的hash函数。当然,实用的字符串hash函数会比这个复杂,均匀性会强得多。
然后,用这个数作为存储时的下标,把value存在数组(的衍生物)里面。如果有多个key得到一个下标,就用嵌套的结构把他们拉开,比如链表、树、重新hash等等。这个系统就叫hash表。