数据结构之(哈希算法)

对于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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值