美文网首页
C Hash表 散列表,又叫哈希表

C Hash表 散列表,又叫哈希表

作者: Rumbles | 来源:发表于2019-04-23 07:44 被阅读0次

    1: 理解HASH表的原理,为什么能实现基于名字快速查找;
    2: 理解HASH算法;
    3: 编写HASH表;

    原理

    key value 的形式。我们知道key。 根据算法 可以知道value存储在表里面的位置 很快得到value 
    
    使用hash算法将字符串的key,转成整数,使用整数找到对应的value;*
    算出来的整数一样就回产生冲突
    
    哈希表的本质是一个数组,数组中每一个元素称为一个箱子(bin),箱子中存放的是键值对
    如果该箱子中已经有了键值对,就使用开放寻址法或者拉链法解决冲突。
    在使用拉链法解决哈希冲突时,每个箱子其实是一个链表,属于同一个箱子的所有键值对都会排列在链表中。
    

    算法[散列,哈希] Hash算法的讲解

    (1) MD4
    
      MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。
    
      (2) MD5
    
      MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好
    
      (3) SHA-1 及其他
    
      SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。
    

    问题

    1. 如果哈希表中本来箱子就比较多,扩容时需要重新哈希并移动数据,性能影响较大。
    2. 如果哈希函数设计不合理,哈希表在极端情况下会变成线性表,性能极低。
    

    解决冲突的方法

    紫色部分即代表哈希表,也称为哈希数组,数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。
    
    哈希表 是一大堆数组组成的。 数组的每个元素都是一个单链表的头节点  数组组成的原因是为了解决冲突的 
    
    开放寻址法或者拉链法解决冲突
    开放寻址法
    
    拉链法
    
    链表
    装箱操作
    

    java中的实现

    #HashMap
    HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头
    
    HashMap是基于哈希表实现的  Hashtable同样是基于哈希表实现的
    HashTable 继承自Dictionary,利用哈希算法散列来在字典中通过关键字查找对应的内容
    都是存储健值对的  Dictionary 已经过时实际开发使用Map函数
    Map<Integer, Integer> map = new HashMap<>(); 
    
    
    Hashtable和HashMap的区别:
    1.Hashtable是基于Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现,c#中无HashMap
    2.Hashtable的方法是同步的,而HashMap的方法不是
    3.HashMap可以让你将空值作为一个表的条目的key或value,Hashtable不可
    
    Hashtable和Dictionary的区别:
    
    (1)Hashtable不支持泛型,而Dictionary支持泛型。
    
     Dictionary<int,string> dictionary = new Dictionary<int,string>();  Hashtable不可如此写
    
    (2). Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。
    
    (3).单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减
    
    

    相关文章

      网友评论

          本文标题:C Hash表 散列表,又叫哈希表

          本文链接:https://www.haomeiwen.com/subject/csjsyqtx.html