对于char* str,常用的哈希算法(信息加密)有如下:
BKDRHash:
1)hash = hash * seed + (*str++)
2)hash初始值为0
· 3)seed: 31 、131 、1313、 13131 、131313 etc..
ELFHash:
1)
SDBMHash:
1)hash = 65599*hash + (*str++);
2)hash初始值为0
RSHash:
1)hash = hash * a + (*str++);
a *= b;
2)b = 378551;a = 63689;
3)hash初始值为0
JSHash:
1)hash ^= ((hash << 5) + (*str++) + (hash >> 2));
2)hash初始值1315423911
代码如下:
hashfunction.h
#include "stdafx.h"
unsigned int SDBMHash(char *str);//SDB Hash Function
unsigned int RSHash(char *str);// RS Hash Function
unsigned int JSHash(char *str);// JS Hash Function
unsigned int PJWHash(char *str);// P. J. Weinberger Hash Function
unsigned int ELFHash(char *str);// ELF Hash Function
unsigned int BKDRHash(char *str);// BKDR Hash Function
unsigned int DJBHash(char *str);// DJB Hash Function
unsigned int APHash(char *str);// AP Hash Function
hashfunction.cpp
#include "stdafx.h"
#include "hashfunction.h"
unsigned int SDBMHash(char *str)
{
unsigned int hash = 0;
while (*str)
{
// equivalent to: hash = 65599*hash + (*str++);
hash = (*str++) + (hash << 6) + (hash << 16) - hash;
}
return (hash & 0x7FFFFFFF);
}
// RS Hash Function
unsigned int RSHash(char *str)
{
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;
while (*str)
{
hash = hash * a + (*str++);
a *= b;
}
return (hash & 0x7FFFFFFF);
}
// JS Hash Function
unsigned int JSHash(char *str)
{
unsigned int hash = 1315423911;
while (*str)
{
hash ^= ((hash << 5) + (*str++) + (hash >> 2));
}
return (hash & 0x7FFFFFFF);
}
// P. J. Weinberger Hash Function
unsigned int PJWHash(char *str)
{
unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);
unsigned int ThreeQuarters = (unsigned int)((BitsInUnignedInt * 3) / 4);
unsigned int OneEighth = (unsigned int)(BitsInUnignedInt / 8);
unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);
unsigned int hash = 0;
unsigned int test = 0;
while (*str)
{
hash = (hash << OneEighth) + (*str++);
if ((test = hash & HighBits) != 0)
{
hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
}
}
return (hash & 0x7FFFFFFF);
}
// ELF Hash Function
unsigned int ELFHash(char *str)
{
unsigned int hash = 0;
unsigned int x = 0;
while (*str)
{
hash = (hash << 4) + (*str++);
if ((x = hash & 0xF0000000L) != 0)
{
hash ^= (x >> 24);
hash &= ~x;
}
}
return (hash & 0x7FFFFFFF);
}
// BKDR Hash Function
unsigned int BKDRHash(char *str)
{
unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
unsigned int hash = 0;
while (*str)
{
hash = hash * seed + (*str++);
}
return (hash & 0x7FFFFFFF);//与是为了返回unsigned类型,如果返回类型是更大的长度如long也可不用加long
}
// DJB Hash Function
unsigned int DJBHash(char *str)
{
unsigned int hash = 5381;
while (*str)
{
hash += (hash << 5) + (*str++);
}
return (hash & 0x7FFFFFFF);
}
// AP Hash Function
unsigned int APHash(char *str)
{
unsigned int hash = 0;
int i;
for (i=0; *str; i++)
{
if ((i & 1) == 0)
{
hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
}
else
{
hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
}
}
return (hash & 0x7FFFFFFF);
}
character_hash.cpp
// Character_Hash.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "hashfunction.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char*p="123abcdfg456";
cout<<"BKDRHash算法:"<<BKDRHash(p)<<endl;
cout<<"ELFHash算法:"<<ELFHash(p)<<endl;
cout<<"SHBMHash算法:"<<SDBMHash(p)<<endl;
cout<<"RSHash算法:"<<RSHash(p)<<endl;
cout<<"JSHash算法:"<<JSHash(p)<<endl;
cout<<"PJWHash算法:"<<PJWHash(p)<<endl;
cout<<"DJBHash算法:"<<DJBHash(p)<<endl;
cout<<"APHash算法:"<<APHash(p)<<endl;
return 0;
}
运行结果如下:
1)哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。
2)哈希(Hash)算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据
3)可以理解为哈希算法(散列函数),是将字符串转换成关键字的过程,然后再对关键字应用与哈希函数和处理冲突方法。
Reference:
1)http://baike.baidu.com/link?url=-SFMmrlhq-JUL8vD8l_0YUhGKcFIQTR4_wYZp31S8yhofrI1j7w8n38EVDkosnVg
2)https://www.byvoid.com/blog/string-hash-compare
3)http://mtnt2008.iteye.com/blog/715096