-
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
关于Hash的说明定义与使用
最新推荐文章于 2022-12-01 04:35:37 发布