什么是 hash?

我大概知道一点hash的东西,比如说指定一个hash函数为newkey=oldkey%23,然后来一个值为oldkey的整数,根据该函数出一个新的ke…
关注者
1,024
被浏览
557,137

53 个回答

谢小圆邀请。

首先回答题主的问题。
hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)。
也就是说,无论数据块m有多大,其输出值h为固定长度。到底是什么原理?将m分成固定长度(如128位),依次进行hash运算,然后用不同的方法迭代即可(如前一块的hash值与后一块的hash值进行异或)。如果不够128位怎么办?用0补全或者用1补全随意,算法中约定好就可以了。
原问题回答完毕。但是既然要说hash算法,不妨说的更透彻些。
=================分割线==========
由于用途的不同,hash在数据结构中的含义和密码学中的含义并不相同,所以在这两种不同的领域里,算法的设计侧重点也不同。

预备小知识:

抗碰撞能力 :对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。

抗篡改能力 :对于一个数据块,哪怕只改动其一个比特位,其hash值的改动也会非常大。

在用到hash进行管理的数据结构中,比如hashmap,hash值(key)存在的目的是 加速键值对的查找, key的作用是为了将元素适当地放在各个桶里,对于抗碰撞的要求没有那么高。换句话说, hash出来的key,只要保证value大致均匀的放在不同的桶里就可以了 。但整个算法的set性能,直接与hash值产生的速度有关,所以这时候的hash值的产生速度就尤为重要,以JDK中的String.hashCode()方法为例:

    public int hashCode() {
        int h = hash;
 //hash default value : 0 
        if (h == 0 && value.length > 0) {
 //value : char storage
            char val[] = value;
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            hash = h;
        return h;