• 浅谈Hash


    基本概念

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的。那么哈希函数的是什么样的?大概就是 value = hash(key),我们希望key和value之间是唯一的映射关系。   大家使用的最多的就是哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数或散列函数。   实际中的Hash主要有两种应用:加密和压缩。在加密方面,Hash哈希是把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值,最广泛应用的Hash算法有MD4、MD5、SHA1。在压缩方面,Hash哈希是指把一个大范围映射到一个小范围,往往是为了节省空间,使得数据容易保存。   当然了,在我们做题的过程中,使用到的hash的方法都是十分简单的。

    Hash的特点

      主要原理就是把大范围映射到小范围,因此输入范围必须和小范围相当或者比它更小,否则增加冲突。   Hash函数逼近单向函数,所以可以用来对数据进行加密。(单项函数:如果某个函数在给定输入的时候,很容易计算出其结果来;而当给定结果的时候,很难计算出输入来)   不同的应用对Hash函数有着不同的要求:用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。

    具体实现

    Hash的方法非常多,有用加法的,有用乘法的,有用位运算的,还有混合的。这里,为了尽可能减小冲突的可能性,我们选择用混合运算去Hash。 Hash的具体思路就是把一串字符计算后形成一个数字。我们直接来看一段Hash的代码来理解吧:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #define ll long long
    #define INF 0x7fffffff
    

    using namespace std;

    int hash(char s[])
    {
    int h = 0, l = strlen(s), k;
    for(register int i = 0; i < l; i++)
    {
    k = s[i];
    h = (h * 31 + k << 1) % 23456789;
    }
    return h;
    }

    char s[1000];

    int main()
    {
    while(1)
    {
    cin >>s;
    cout <<hash(s) << endl;
    }
    return 0;
    }

  • 相关阅读:
    数据操作-对数据的增删改查-单表查询和多表查询
    爬虫从入门到放弃
    爬虫从入门到放弃
    创建表的完整语法及表之间的关系
    树链剖分练习总结
    [BZOJ]1984: 月下“毛景树”
    [BZOJ]2243: [SDOI2011]染色
    [BZOJ]4034: [HAOI2015]树上操作
    NOIP2012题解
    CODEVS4633 [Mz]树链剖分练习
  • 原文地址:https://www.cnblogs.com/aurorapolaris/p/13502449.html
Copyright © 2020-2023  润新知