码迷,mamicode.com
首页 > 其他好文 > 详细

hash哈希

时间:2018-02-23 23:41:59      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:一个   str   ace   字符串   i++   cstring   out   pre   log   

我复习的时候,突然发现没写过hash算法,惊讶!!!赶紧补一下。

把字符串看成base进制的数。Hash值比较就是为了判断是否有相同的字符串。(base是自己定义的大于26的质数,个人认为大一点比较好)

下面是代码

void hash(char a[],int p)
{
  int l = strlen(a);
  unsigned long long tot;
  for(int i = 0;i < l;i++)
     tot  = (tot * base) + a[i]; //base = 131
  data[p] = tot;
}

这是一个简单的一维hash,假如有冲突的话可以用二维哈希来处理冲突(就是再找一个base,每个字符串再求一个对应的hash值)

来一个例题

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
char s[10000];
ull a[10000];
int m,k = 1;
const ull base = 131;
int haxi(char s[])
{
    int l = strlen(s);
    ull tot = 0;
    for(int i = 0;i < l;i++)
    {
        tot = tot * base + (s[i] - a);
    }
    return tot&0x7fffffff;
}
int main()
{
    cin>>m;
    for(int i = 0;i < m;i++)
    {
        scanf("%s",s);
        a[i] = haxi(s);
    }
    sort(a,a + m);
    for (int i = 1;i < m;i++)
        if (a[i] != a[i - 1])
            k++;
    cout<<k<<endl;
    return 0;
}

这个代码就是想知道到底读入了几个不同的字符串,但不要求记录,所以hash变的很合适。

hash哈希

标签:一个   str   ace   字符串   i++   cstring   out   pre   log   

原文地址:https://www.cnblogs.com/DukeLv/p/8463630.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!