关于Hash的说明定义与使用

  • Hash说明与定义
    hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)。也就是说,无论数据块m有多大,其输出值h为固定长度。到底是什么原理?将m分成固定长度(如128位),依次进行hash运算,然后用不同的方法迭代即可(如前一块的hash值与后一块的hash值进行异或)。如果不够128位怎么办?用0补全或者用1补全随意,算法中约定好就可以了。
    哈希表
    哈希表属于一种物理存储结构,它应用了哈希算法因此称之为哈希表。物理存储结构共4种:顺序、链式、索引、散列,其中顺序和链式最常见,这两种存储结构的共同特征是元素之间有着映射关系,而哈希表(散列存储结构)的元素之间相互独立。索引存储结构类似现实世界中的字典目录,在此不多赘述。哈希表的实现方式:给定一个任意类型的数据,称为键,使用哈希算法加工该数据,把生成的结果作为键的存储地址。例如给定一个字符串参数
    “str”,该键对应的元素是"jack",那么"jack"的存储地址就是通过哈希算法对"str"进行加工生成的。这么一来,每当存取元素时不会像传统的数据结构逐个遍历、一一对比,而是通过哈希算法直接获取元素的存储地址,因此哈希表会比传统的数据结构更为高效,这也是使用哈希表的原因。
    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;
    }

    来源链接:https://www.zhihu.com/question/26762707/answer/40119521

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值