数据结构之(哈希算法)

来源:互联网 发布:电脑上画画的软件 编辑:程序博客网 时间:2024/05/16 03:21

对于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 Functionunsigned int RSHash(char *str);// RS Hash Functionunsigned int JSHash(char *str);// JS Hash Functionunsigned int PJWHash(char *str);// P. J. Weinberger Hash Functionunsigned int ELFHash(char *str);// ELF Hash Functionunsigned int BKDRHash(char *str);// BKDR Hash Functionunsigned int DJBHash(char *str);// DJB Hash Functionunsigned 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 Functionunsigned 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 Functionunsigned int JSHash(char *str){unsigned int hash = 1315423911;while (*str){hash ^= ((hash << 5) + (*str++) + (hash >> 2));}return (hash & 0x7FFFFFFF);}// P. J. Weinberger Hash Functionunsigned 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 Functionunsigned 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 Functionunsigned 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 Functionunsigned int DJBHash(char *str){unsigned int hash = 5381;while (*str){hash += (hash << 5) + (*str++);}return (hash & 0x7FFFFFFF);}// AP Hash Functionunsigned 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


原创粉丝点击