`
什么都不懂的孩子
  • 浏览: 28060 次
社区版块
存档分类
最新评论

对Hash认识

阅读更多

       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里面的那一种。

 

  • 大小: 6.6 KB
分享到:
评论

相关推荐

    Hash算法MD5实验报告材料.doc

    本实验报告主要介绍了Hash算法MD5的实验报告,旨在通过实际编程来了解MD5算法的加密和解密过程,并加深对Hash算法的认识。 一、Hash算法的定义 Hash算法是一种将输入数据转换为固定长度的字符串的算法。Hash算法的...

    认识hash表

    ### 认识哈希表 #### 一、哈希表简介 哈希表(Hash Table),也称为散列表,是一种非常高效的数据结构,其主要功能是实现基于关键字的快速访问。哈希表的核心思想是通过一种特殊的映射机制——哈希函数(Hash ...

    MD5_Hash_Changer-1.1.0.zip

    同时,我们也应该认识到,依赖于MD5哈希的简单更改来逃避检测并不是一种长期有效的策略,因为更复杂的检测技术正在不断发展。在使用此类工具时,务必遵守法律法规,尊重软件版权,并充分理解可能带来的风险。

    基于混沌的Hash函数的安全性分析

    随着密码学领域的迅速发展,Hash函数作为构建信息安全系统的基石,其重要性不断上升。Hash函数是一种能够将任意长度的消息...通过这种分析,可以促进密码学界对安全性的进一步认识,并推动安全Hash算法的发展与改进。

    1.杨弋《Hash在信息学竞赛中的一类应用》1

    通过这篇文章的学习,我们可以深刻认识到,Hash表在解决特定类型问题时的高效性,并了解如何通过精心设计的Hash函数来优化算法性能。对于信息学竞赛的参与者来说,这不仅是一次理论知识的学习,也是一次实际解决问题...

    hash-al.rar

    通过阅读和分析这些代码,开发者可以深入理解哈希函数的工作原理,提高对信息安全技术的认识,同时也能够提升C语言编程能力。然而,需要注意的是,为了确保软件的安全性,应当优先选择经过广泛测试和认证的库,例如...

    MD5 hash 验证软件

    MD5 Hash验证软件是计算机领域中用于数据完整性检查的重要工具,尤其在下载文件、软件安装包验证以及存储...但也要认识到,随着技术的发展,MD5的安全性已受到挑战,因此在涉及敏感信息时应考虑使用更安全的哈希算法。

    PyPI 官网下载 | maphash-0.1.0-py3-none-any.whl

    进一步说,maphash可能还提供了对哈希冲突的处理策略,这在处理大量数据时尤为重要,因为任何哈希函数都可能存在冲突。开发者可以利用maphash库提供的方法来降低哈希冲突的影响,提高整体性能。 总的来说,maphash-...

    Hash V1.04 MD5验证SHA1 CRC32工具

    首先,我们来认识一下MD5(Message-Digest Algorithm 5)。MD5是由Ronald Rivest在1991年设计的一种广泛使用的哈希函数,它可以将任意长度的数据转化为固定长度的摘要,通常是128位,以16进制表示就是32个字符。MD5...

    Cryptanalysis of the Hash Functions MD4 and RIPEMD

    同时,研究人员也更加关注算法的密码分析方法,希望通过不断的研究提高对杂凑函数安全性的认识,为未来可能出现的新型攻击提供防御策略。此外,随着量子计算的发展,对传统加密算法的攻击方法可能面临新的挑战,这也...

    JH hash function

    ### JH哈希函数概述与关键技术点 #### 引言 JH哈希函数作为美国国家标准与技术研究院(NIST)举办的哈希...通过对其设计原理、关键技术点及安全性分析的深入了解,我们可以更加全面地认识到JH哈希函数的重要价值。

    hash函数MD5算法源程序

    MD5算法,全称为Message-Digest Algorithm 5,是一款由Ronald Rivest于1991年设计的哈希函数,它的存在极大地促进了数据...开发者们在使用MD5时应该充分认识到其局限性,并关注更安全的替代算法,以确保应用的安全性。

    Murmur3 hash in C.zip

    总的来说,理解并实现Murmur3哈希算法,不仅可以提升对哈希函数的认识,还能在实际项目中有效利用其优势,提高数据处理的效率和质量。在C语言中实现Murmur3,需要熟悉位操作、指针以及内存处理,这对于提升编程能力...

    KenNaNa#big-frontend-knowlage#VueRouter中hash和history模式的原理1

    介绍historymode前,需要先认识window.history对象另外一类是pushState(), replaceState()这种,是操作历史记录的接

    Java 对象头(认识oop+oop的继承体系+InstanceOopDesc+arrayOopDesc+markword)

    其中,markword 是一个 64 位的标志位,用于存储对象的状态信息,如锁信息、hash 码、GC 信息等。klass 是对象的类信息,metadata 是对象的元数据信息。 oop 的继承体系 在 Java 中,oop 是一个基本的数据结构,...

    两两认识leetcode-Leetcode_record:Leetcode_record

    两两认识leetcode Leetcode_record :oncoming_fist: 获得offer :penguin: 和 :grinning_face_with_smiling_eyes: 已审查的问题:18 方法一 Hashmap class Solution : def twoSum ( self , nums : List [ int ], ...

    哈希表实例源码

    总之,理解并实现哈希表不仅可以提升你的C语言编程技能,也能让你对数据结构和算法有更深的认识。这对于成为一名优秀的IT专业人员至关重要,特别是在系统开发、数据库管理和高性能计算等领域。通过研究这个实例,你...

    programming-univbasics-nds-hashes-of-hashes-lab-online-web-prework

    使用Array和Hash的Array和Hash Array后,您会惊喜地发现, Hash Hash (HoH)的大多数语法都像AoA一样工作,但是使用Hash键作为a的组成部分。协调。 与AoA可以帮助您在网格中找到位置的坐标系不同,HoH中的坐标可以...

Global site tag (gtag.js) - Google Analytics