Hash是各种程序语言中经常用到的一个“算法”或者说“结构”,按我的理解,hash就是把大量的数据打乱,对每一个数据分配一个唯一的映射值,然后重新储存,对于每一个关键字Value,都有一个映射值Key对应,既通过唯一的f(key)可以找到value;
在每次通过key查找的时候就可以通过常数级时间查到我们所需要的对象,是一个用空间换时间的典型例子,这Hash最主要的部分当然是用一个算法(哈希函数)来分配每一个Value的映射值(就是f(key)),这里有一个例子,假设有一个从1-100岁的人口数据统计表,我们就可以把年龄当做key,hash函数就去key自身,那么当我们要查20岁的有多少人,就可以直接查表第20项;或者我们也可以把hash函数取key的某个整数的模,同样我们查找的时候根据key和hash算法的逆求出value所在位置;
那么我们就要解决另外一个问题了,就像上面的图片右边,data会有重复的f(key)值,就造成分配冲突,这个时候 我们可以再横向的建立一个链表,把冲突的f(key)放到后面去,就向上面说的;当然,这个方法肯定不是一个好的方法,当冲突的数量达到一定的程度的时候,就完全抹掉了hash的优点,甚至变成了累赘;一个好的hash函数当然是这个好的hash函数的前提,但是对于现在的TB级大数据,hash肯定会有冲突,那就要rehash;下面介绍一下java的HashTable里面的rehash方法
protected void rehash() {
int oldCapacity = table.length;
//元素
Entry<K,V>[] oldMap = table;
int newCapacity = (oldCapacity << 1) + 1; //新容量=旧容量 * 2 + 1
if (newCapacity - MAX_ARRAY_SIZE > 0) {
if (oldCapacity == MAX_ARRAY_SIZE)
return;
newCapacity = MAX_ARRAY_SIZE;
}
Entry<K,V>[] newMap = new Entry[]; //新建一个size = newCapacity 的HashTable
modCount++;//这个先不管它
//重新计算阀值
threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
//重新计算hashSeed
boolean rehash = initHashSeedAsNeeded(newCapacity);
table = newMap;
//将原来的元素拷贝到新的HashTable中
for (int i = oldCapacity ; i-- > 0 ;) {
for (Entry<K,V> old = oldMap[i] ; old != null ; ) {
Entry<K,V> e = old;
old = old.next;
if (rehash) {
e.hash = hash(e.key);
}
int index = (e.hash & 0x7FFFFFFF) % newCapacity;
e.next = newMap[index];
newMap[index] = e;
}
}
}
可以看到,HashTable里面是把Entry的容量扩大,然后把原来的数据重新copy进去,这个是一个十分耗时间的过程,hashseed是用计算key的hash值,把它和hashcode进行按位异或运算,hashcode这个东东也有的研究,等我深究一下下再写出来跟大家分享一下,暂时可以理解成是物理地址,回过去说hashseed事实上就是用于解决冲突的。还有阙值threshold,它是用来判断是否需要rehash,这里阙值的大小要跟随HashTable的Capacity(容量)来改变,初始的阙值因子是0.75,假设我们原先初始值11、加载因子默认0.75,那么这个时候阀值threshold=8,当容器中的元素达到8时,HashTable进行一次扩容操作,容量 = 8 * 2 + 1 =17,而阀值threshold=17*0.75 = 13,当容器元素再一次达到阀值时,HashTable还会进行扩容操作,一次类推。
解决冲突的方法不止一种,对于相对较少的数据可以用hashtable里面的那一种。
相关推荐
本实验报告主要介绍了Hash算法MD5的实验报告,旨在通过实际编程来了解MD5算法的加密和解密过程,并加深对Hash算法的认识。 一、Hash算法的定义 Hash算法是一种将输入数据转换为固定长度的字符串的算法。Hash算法的...
### 认识哈希表 #### 一、哈希表简介 哈希表(Hash Table),也称为散列表,是一种非常高效的数据结构,其主要功能是实现基于关键字的快速访问。哈希表的核心思想是通过一种特殊的映射机制——哈希函数(Hash ...
同时,我们也应该认识到,依赖于MD5哈希的简单更改来逃避检测并不是一种长期有效的策略,因为更复杂的检测技术正在不断发展。在使用此类工具时,务必遵守法律法规,尊重软件版权,并充分理解可能带来的风险。
随着密码学领域的迅速发展,Hash函数作为构建信息安全系统的基石,其重要性不断上升。Hash函数是一种能够将任意长度的消息...通过这种分析,可以促进密码学界对安全性的进一步认识,并推动安全Hash算法的发展与改进。
通过这篇文章的学习,我们可以深刻认识到,Hash表在解决特定类型问题时的高效性,并了解如何通过精心设计的Hash函数来优化算法性能。对于信息学竞赛的参与者来说,这不仅是一次理论知识的学习,也是一次实际解决问题...
通过阅读和分析这些代码,开发者可以深入理解哈希函数的工作原理,提高对信息安全技术的认识,同时也能够提升C语言编程能力。然而,需要注意的是,为了确保软件的安全性,应当优先选择经过广泛测试和认证的库,例如...
MD5 Hash验证软件是计算机领域中用于数据完整性检查的重要工具,尤其在下载文件、软件安装包验证以及存储...但也要认识到,随着技术的发展,MD5的安全性已受到挑战,因此在涉及敏感信息时应考虑使用更安全的哈希算法。
进一步说,maphash可能还提供了对哈希冲突的处理策略,这在处理大量数据时尤为重要,因为任何哈希函数都可能存在冲突。开发者可以利用maphash库提供的方法来降低哈希冲突的影响,提高整体性能。 总的来说,maphash-...
首先,我们来认识一下MD5(Message-Digest Algorithm 5)。MD5是由Ronald Rivest在1991年设计的一种广泛使用的哈希函数,它可以将任意长度的数据转化为固定长度的摘要,通常是128位,以16进制表示就是32个字符。MD5...
同时,研究人员也更加关注算法的密码分析方法,希望通过不断的研究提高对杂凑函数安全性的认识,为未来可能出现的新型攻击提供防御策略。此外,随着量子计算的发展,对传统加密算法的攻击方法可能面临新的挑战,这也...
### JH哈希函数概述与关键技术点 #### 引言 JH哈希函数作为美国国家标准与技术研究院(NIST)举办的哈希...通过对其设计原理、关键技术点及安全性分析的深入了解,我们可以更加全面地认识到JH哈希函数的重要价值。
MD5算法,全称为Message-Digest Algorithm 5,是一款由Ronald Rivest于1991年设计的哈希函数,它的存在极大地促进了数据...开发者们在使用MD5时应该充分认识到其局限性,并关注更安全的替代算法,以确保应用的安全性。
总的来说,理解并实现Murmur3哈希算法,不仅可以提升对哈希函数的认识,还能在实际项目中有效利用其优势,提高数据处理的效率和质量。在C语言中实现Murmur3,需要熟悉位操作、指针以及内存处理,这对于提升编程能力...
介绍historymode前,需要先认识window.history对象另外一类是pushState(), replaceState()这种,是操作历史记录的接
其中,markword 是一个 64 位的标志位,用于存储对象的状态信息,如锁信息、hash 码、GC 信息等。klass 是对象的类信息,metadata 是对象的元数据信息。 oop 的继承体系 在 Java 中,oop 是一个基本的数据结构,...
两两认识leetcode Leetcode_record :oncoming_fist: 获得offer :penguin: 和 :grinning_face_with_smiling_eyes: 已审查的问题:18 方法一 Hashmap class Solution : def twoSum ( self , nums : List [ int ], ...
总之,理解并实现哈希表不仅可以提升你的C语言编程技能,也能让你对数据结构和算法有更深的认识。这对于成为一名优秀的IT专业人员至关重要,特别是在系统开发、数据库管理和高性能计算等领域。通过研究这个实例,你...
使用Array和Hash的Array和Hash Array后,您会惊喜地发现, Hash Hash (HoH)的大多数语法都像AoA一样工作,但是使用Hash键作为a的组成部分。协调。 与AoA可以帮助您在网格中找到位置的坐标系不同,HoH中的坐标可以...