1 以下给出三个hash算法
1 hash_add
2 hash_rotate
3 BKDR_Hash
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdint.h>
using namespace std;
#include <unordered_map>
static int hash_add(const char* key, int prime)
{
int hash, i;
int len = strlen(key);
for (hash = len, i = 0; i < len; i++)
hash += key[i];
return (hash % prime);
}
static int hash_rotate(const char* key, int prime)
{
int hash, i;
int len = strlen(key);
for (hash = len, i = 0; i < len; i++)
{
hash = (hash << 4 >> 28) ^ key[i];
return (hash % prime);
}
}
static long BKDR_Hash(const char* str) {
long seed = 131;
long hash = 0;
for (int i = 0; i < strlen(str); i++) {
hash = hash * seed + str[i];
//System.out.println(hash);
}
return (hash & 0x7FFFFFFF);//32位
//return (hash & 0x7FFFFFFFFFFFFFFFL);//64位
}
2 测试代码
注意注释,请自行发挥
//34017101 00 200 0 000001------代表中心服务器
//34017101 00 111 0 000001------代表DVR
//34017101 01 118 0 000002------代表NVR
//34017101 01 132 0 000003------代表摄像机
int main()
{
const char* ssrc0 = "34020000001320000055";
const char* ssrc1 = "34020000001320000056";
uint32_t x = 1320000000;
int i = 0;
std::unordered_map<uint32_t, int> mm;
while (i < 10000000)
{
char buffer[128];
sprintf(&buffer[0], "3402000000%lu", x);
int ret = BKDR_Hash(buffer);
//cout << ret << endl;
mm[ret] = x;
x++;
i++;
}
cout << "size is :" << mm.size() << endl;
mm.clear();
}