// hash.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;
#include <ctype.h>;
#include <time.h>;
// ELF Hash Function
unsigned int ELFHash(char *str)
{
unsigned int hash = 0;
unsigned int x = 0;
while (*str)
{
hash = (hash << 4) + (*str++);//hash左移4位,把当前字符ASCII存入hash低四位。
if ((x = hash & 0xF0000000L) != 0)
{
//如果最高的四位不为0,则说明字符多余7个,现在正在存第7个字符,如果不处理,再加下一个字符时,第一个字符会被移出,因此要有如下处理。
//该处理,如果最高位为0,就会仅仅影响5-8位,否则会影响5-31位,因为C语言使用的算数移位
//因为1-4位刚刚存储了新加入到字符,所以不能>>28
hash ^= (x >> 24);
//上面这行代码并不会对X有影响,本身X和hash的高4位相同,下面这行代码&~即对28-31(高4位)位清零。
hash &= ~x;
}
}
//返回一个符号位为0的数,即丢弃最高位,以免函数外产生影响。(我们可以考虑,如果只有字符,符号位不可能为负)
return (hash & 0x7FFFFFFF);
}
static int seed = 0;
void getRandString(char buffer[],int number)
{
char str[64] = "00123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int i;
char ss[2];
srand(seed++); // seed with time
for(i=1;i<=number;i++)
{
int ret = rand()%62;
sprintf(ss,"%c",str[(rand()%62)+1]);
strcat(buffer,ss);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char str[1000][32];
memset(str, 0x00, sizeof(str));
int restult[1000];
int total[10];
memset(total,0x00, sizeof(total));
seed = time(NULL);
for (int i = 0; i < 1000; i++)
{ memset(str[i],0x00,sizeof(str[i]));
getRandString(str[i], 10);
restult[i] = ELFHash(str[i]);
int k = restult[i]%10;
total[k]++;
printf("---------str=%s--------%d-------%d--- ---%d---\r\n",str[i] ,restult[i],restult[i]%10,k);
// ::_sleep(1000);
}
for (int j = 0; j < 10; j++)
{
printf("-----------------------%d---------------- \r\n", total[j]);
}
system("pause");
return 0;
}