`
explorers
  • 浏览: 14527 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

<转>各种字符串Hash函数比较

阅读更多
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用

位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,

这些函数几乎不可能找到碰撞。

常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,

PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。

Hash函数	数据1	数据2	数据3	数据4	数据1得分	数据2得分	数据3得分	数据4得分	平均分
BKDRHash	2	0	4774	481	96.55	100	90.95	82.05	92.64
APHash	2	3	4754	493	96.55	88.46	100	51.28	86.28
DJBHash	2	2	4975	474	96.55	92.31	0	100	83.43
JSHash	1	4	4761	506	100	84.62	96.83	17.95	81.94
RSHash	1	0	4861	505	100	100	51.58	20.51	75.96
SDBMHash	3	2	4849	504	93.1	92.31	57.01	23.08	72.41
PJWHash	30	26	4878	513	0	0	43.89	0	21.95
ELFHash	30	26	4878	513	0	0	43.89	0	21.95

其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句

子哈希冲突个数。数据3为数据1的哈希值与1000003(大素数)求模后存储到线性表中冲突的个数。

数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。

经过比较,得出以上平均得分。平均数为平方平均数。可以发现,BKDRHash无论是在实际效果还是

编码实现中,效果都是最突出的。APHash也是较为优秀的算法。DJBHash,JSHash,RSHash与

SDBMHash各有千秋。PJWHash与ELFHash效果最差,但得分相似,其算法本质是相似的。

在信息修竞赛中,要本着易于编码调试的原则,个人认为BKDRHash是最适合记忆和使用的。

CmYkRgB123原创,欢迎建议、交流、批评和指正。

 

附:各种哈希函数的C语言程序代码
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 
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 
unsigned int JSHash(char *str)
{
	unsigned int hash = 1315423911;
 
	while (*str)
	{
		hash ^= ((hash << 5) + (*str++) + (hash >> 2));
	}
 
	return (hash & 0x7FFFFFFF);
}
 
// P. J. Weinberger Hash 
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 
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 
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);
}
 
// DJB Hash 
unsigned int DJBHash(char *str)
{
	unsigned int hash = 5381;
 
	while (*str)
	{
		hash += (hash << 5) + (*str++);
	}
 
	return (hash & 0x7FFFFFFF);
}
 
// AP Hash 
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);
}
分享到:
评论

相关推荐

    各种字符串Hash函数比较[借鉴].pdf

    各种字符串Hash函数比较[借鉴].pdf

    mysql5.1中文手册

    字符串比较函数&lt;br&gt;12.4. 数值函数&lt;br&gt;12.4.1. 算术操作符&lt;br&gt;12.4.2. 数学函数&lt;br&gt;12.5. 日期和时间函数&lt;br&gt;12.6. MySQL使用什么日历?&lt;br&gt;12.7. 全文搜索功能&lt;br&gt;12.7.1. 布尔全文搜索&lt;br&gt;12.7.2. 全文搜索带查询...

    hash字符串函数总结

    hash字符串函数总结,挥泪大放送,绝对全面,各类总结。

    用C语言实现常用的字符串哈希函数

    用C语言实现常用的字符串哈希函数,比如RSHash、JSHash、PJWHash、FNVHash等

    各种字符串Hash函数比较1

    Hash函数数据1数据2数据3数据4数据1得分数据2得分数据3得分数据4得分平均分BKDRHash20477448196.5510090.9582.0592.6

    经典字符串hash函数

    几个经典字符串hash函数,SDBM/RS/JS/BKDR/DJB/AP HASH

    经典字符串Hash函数测试

    经典字符串Hash函数测试,非常值得一看。

    AJAX 源码范例

    07/7.2.3.html 获取cookie的值范例&lt;br&gt; 07/7.2.4.html 给cookie设置终止日期范例&lt;br&gt; 07/7.2.5.html 删除cookie范例&lt;br&gt; 07/7.2.8.html 综合示例:构造通用的cookie处理函数&lt;br&gt; 07/7.4.2.html 使用定时器...

    字符串哈希函数设计

    实验设计优化字符串哈希函数 比较经典字符串哈希函数 采用斐波那契函数思想

    字符串Hash

    字符串Hash函数把一个任意长度的字符串映射成一个非负整数,并且其冲突概率几乎为 000。 取一固定值 PPP,把字符串看作 PPP 进制数,并分配一个大于 000 的数值,代表每种字符。一般来说,我们分配的数值都远小于P。...

    MD5计算检验工具 x64

    &lt;br&gt;&lt;br&gt; MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为...

    MD5计算检验工具 x32

    &lt;br&gt;&lt;br&gt; MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为...

    javascript实现获取字符串hash值

    性能很高的计算字符串或文件hash值的函数,比md5速度快得多,自己一直用着,重复的几率为很底,一般的应用足够, var I64BIT_TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-'.split...

    freemarker总结

    其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替&gt;会有更好的效果,因为 FreeMarker会把&gt;解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:&lt;#if (x&gt;y)&gt; ...

    C#实现给定字符串生成MD5哈希的方法

    本文实例讲述了C#实现给定字符串生成MD5哈希的方法。分享给大家供大家参考。具体分析如下: 这里首先需要下面的命名空间的引用: 代码如下:System.Security.Cryptography; System.Web.Security; 主要代码如下: //...

    bloomFilter 中的hash函数及测试程序

    该文档中包含 bloomFilter过滤器中用到的对于字符串进行hash的hash函数共十一个,并带有测试程序..

    Hash函数的设计优化

    本文主要介绍Hash函数的设计优化,包括数字、字符串、排列等,并给出相关的代码。

    c++中template对字符串的处理方法

    C++中的Template作用是把仅类型不同但功能相似的函数合并在一起,但是有时候template中的函数并不能满足所有的类型调用。如下所示: template &lt;class&gt; ...inline int hash_wrap&lt;string&gt;(conststring &

    Wmd5cCS22

    &lt;br&gt;MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的...

Global site tag (gtag.js) - Google Analytics