1. 程式人生 > >hash哈希

hash哈希

space for 簡單的 () body ace 二維 記錄 i++

我復習的時候,突然發現沒寫過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哈希