zoukankan      html  css  js  c++  java
  • Hash哈希

    Hash概念:

    Hash,一般翻译为“散列”,或者音译为“哈希”。就是把任意长度的输入(又叫做预映射,per-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转化是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以并不能从散列值确定唯一的输入值。

    简单的说就是一种将任意长度的消息压缩到某一固定长度消息的摘要 的函数。

    Hash优点:

    先分类再查找,通过计算缩小范围,加快查找速度。

    例:

    集合:{13,19,25,27,17}

    若是采用数组或链表结构:

    访问其中的一个元素(如18),需要遍历整个集合的元素,时间复杂度为O(n).

    而采用哈希表时:

    假如散列函数为H[key] = key % 5;则集合元素对应的hash值分别为{3,4,0,2,2}。
    访问元素(18)只需要在Hash值为2的集合中寻找即可.
    如果访问没有哈希冲突的元素,例如访问(25),可以直接访问哈希值为(0)的值。
    故hash时间复杂度最差才为O(n),最优情况下只需要O(1);

    散列函数(Hash函数)

    Hash通过Hash函数,将key值映射为地址,Address=F[key];

    常用的HASH函数:

    直接定址法:直接以关键字k或者k加上某个常数(k+c)作为哈希地址。

    数字分析法:提取关键字中取值比较均匀的数字作为哈希地址。

    除留余数法:用关键字k除以某个不大于哈希表长度m的数p,将所得余数作为哈希表地址。

    分段叠加法:按照哈希表地址位数将关键字分成位数相等的几部分,其中最后一部分可以比较短。然后将这几部分相加,舍弃最高进位后的结果就是该关键字的哈希地址。

    平方取中法:如果关键字各个部分分布都不均匀的话,可以先求出它的平方值,然后按照需求取中间的几位作为哈希地址。

    伪随机数法:采用一个伪随机数当作哈希函数。

    哈希冲突

    不管选用何种散列函数,不可避免的都会产生不同Key值对应同一个Hash地址的情况,这种情况叫做哈希冲突。

    当冲突发生时,我们需要想办法解决冲突,一般常用的方法有:开放寻址法、链地址法(拉链法)、再散列法等方法。

    常用hash算法的介绍:1)MD4(2)MD5它对输入仍以512位分组,其输出是4个32位字的级联3)SHA-1及其他

  • 相关阅读:
    luogu P1613 跑路
    luogu P2047 社交网络
    luogu P2740 [USACO4.2]草地排水Drainage Ditches
    「字典树」最大异或对
    「贪心」耍杂技的牛
    「贪心」士兵
    「贪心」糖果传递
    「几何」[USACO12DEC]疯狂的栅栏Crazy Fences
    「LCA」[USACO10HOL]牛的政治Cow Politics
    「二分答案 + 前缀和」防线
  • 原文地址:https://www.cnblogs.com/cangshublogs/p/10840100.html
Copyright © 2011-2022 走看看