字符串Hash函数

【JS数据结构与算法】实现哈希函数 目录 一、优秀的哈希函数 1、幂的连乘 2、霍纳法则(秦九韶算法) 3、如何做到均匀分布。 二、实现哈希函数 一、优秀的哈希函数 在构造哈希表之前,我们需要一个哈希函数对数据进行哈希化。 那这个哈希函数怎么实现呢,根据前面一篇博客【JS数据结构】认识哈希表,我们已经认识了什么是哈希表以及为什么需要设计一个哈希函数。 其实就是要达到两个目的: 能够快速地计算,快速地获取hashC... 阅读详情

Hash函数:Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。完美的hash函数,满足key1!=key2,则hash(key1)!=hash(key2)。

字符串Hash函数:在处理大规模字符串数据时常常需要把每个字符串映射出一个ID值,以下列出一些常用经典的字符串Hash函数。

#include <iostream>

using namespace std;

//Brian Kernighan与Dennis Ritchie的《The C Program Language》中提出,也是Java中采用的Hash算法
template<class T>
unsigned int BKDRHash(const T* str)
{
	register unsigned int hash = 0;
	register unsigned int seed = 131;//31,131,1313,13131,131313...
	while(*str)
	{
		hash = hash*seed + (*str++);
		//hash = (hash << 7) + (hash << 1) + hash + (*str++);
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//在开源项目SDBM(数据库引擎)中应用,和BKDRHash方法基本相同只是seed不同
template<class T>
unsigned int SDBMHash(const T* str)
{
	register unsigned int hash = 0;
	register unsigned int seed = 65599;
	while(*str)
	{
		hash = hash*seed + (*str++);
		//hash = (hash << 6) + (hash << 16) - hash + (*str++);
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//在Robert Sedgwicks的《Algorithms in C》中提出
template<class T>
unsigned int RSHash(const T* str)
{
	register unsigned int hash = 0;
	register unsigned int magic = 63689;
	register unsigned int factor = 378551;
	while(*str)
	{
		hash = hash*magic + (*str++);
		magic *= factor;
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//Arash Partow提出
template<class T>
unsigned int APHash(const T* str)
{
	register unsigned int hash = 0;
	unsigned int ch;
	for(long i=0;ch = (unsigned int)(*str++); ++i)
	{
		if(0==(i&1))
		{
			hash ^= ((hash << 7)^ch^(hash >> 3));
		}
		else
		{
			hash ^= (~((hash << 11)^ch^(hash >> 5)));
		}
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//Justin Sobel 提出
template<class T>
unsigned int JSHash(const T* str)
{
	register unsigned int hash = 1315423911;
	while(*str)
	{
		hash ^= ((hash << 5) + (hash >> 2) + (*str++));
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//Donald E. Knuth在《Art Of Computer Programming Volume 3》中提出
template<class T>
unsigned int DEKHash(const T* str)
{
	register unsigned int hash = 1315423911;
	while(*str)
	{
		hash ^= ((hash << 5)^(hash >> 2)^(*str++));
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//Unix System中使用的一种Hash算法,后在Microsoft中hash_map中实现
template<class T>
unsigned int FNVHash(const T* str)
{
	register unsigned int hash = 2166136261;
	while(*str)
	{
		hash *= 16777619;
		hash ^= (*str++);
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//Daniel J. Bernstein教授发明的一种Hash算法
template<class T>
unsigned int DJBHash(const T* str)
{
	register unsigned int hash = 5381;
	while(*str)
	{
		hash += ((hash << 5) + *str++);
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//Daniel J. Bernstein教授发明的又一种Hash算法
template<class T>
unsigned int DJB2Hash(const T* str)
{
	register unsigned int hash = 5381;
	while(*str)
	{
		hash = (hash*33)^(*str++);
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}


//基于AT&T贝尔实验室Peter J. Weinberger的论文而发明的一种Hash算法
template<class T>
unsigned int PJWHash(const T* str)
{
	static const unsigned int TotalBits             = sizeof(unsigned int)*8;
	static const unsigned int ThreeQuarters             = (TotalBits*3)/4;
	static const unsigned int OneEighth             = TotalBits/8;
	static const unsigned int HighBits             = ((unsigned int)-1) << (TotalBits-OneEighth);

	register unsigned int hash = 0;
	unsigned int magic = 0;
	while(*str)
	{
		hash = (hash<<OneEighth)+(*str++);
		if((magic=(hash&HighBits))!=0)
		{
			hash = ((hash^(magic>>ThreeQuarters))&(~HighBits));
		}
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//由Unix的Extended Library Function附带的一种Hash算法,其实是PJW Hash的变形
template<class T>
unsigned int ELFHash(const T* str)
{
	static const unsigned int TotalBits             = sizeof(unsigned int)*8;
	static const unsigned int ThreeQuarters         = (TotalBits*3)/4;
	static const unsigned int OneEighth             = TotalBits/8;
	static const unsigned int HighBits              = ((unsigned int)-1) << (TotalBits-OneEighth);

	register unsigned int hash = 0;
	unsigned int magic = 0;
	while(*str)
	{
		hash = (hash<<OneEighth)+(*str++);
		if((magic=(hash&HighBits))!=0)
		{
			hash ^= (magic >> ThreeQuarters);
			hash &= ~magic;
		}
	}
	//return (hash&0x7FFFFFFF);
	return hash;
}

//编程珠玑中提到的一种
template<class T>
unsigned int PearlsHash(const T* str)
{
	register unsigned int hash = 0;
	register unsigned int NHASH = 29989;
	register unsigned int MULT = 31;
	while(*str)
	{
		hash = (hash*MULT)+(*str++);
	}
	return (hash%NHASH);
}

int main()
{
	char* str = "192.168.10.0";

	unsigned int hashCode;
	hashCode = BKDRHash<char>(str);
	cout << "BKDRHash hashCode = " << hashCode << endl;

	hashCode = SDBMHash<char>(str);
	cout << "SDBMHash hashCode = " << hashCode << endl;

	hashCode = RSHash<char>(str);
	cout << "RSHash hashCode = " << hashCode << endl;

	hashCode = APHash<char>(str);
	cout << "APHash hashCode = " << hashCode << endl;

	hashCode = JSHash<char>(str);
	cout << "JSHash hashCode = " << hashCode << endl;

	hashCode = DEKHash<char>(str);
	cout << "DEKHash hashCode = " << hashCode << endl;

	hashCode = FNVHash<char>(str);
	cout << "FNVHash hashCode = " << hashCode << endl;

	hashCode = DJBHash<char>(str);
	cout << "DJBHash hashCode = " << hashCode << endl;

	hashCode = DJB2Hash<char>(str);
	cout << "DJB2Hash hashCode = " << hashCode << endl;

	hashCode = PJWHash<char>(str);
	cout << "PJWHash hashCode = " << hashCode << endl;

	hashCode = ELFHash<char>(str);
	cout << "ELFHash hashCode = " << hashCode << endl;

	hashCode = PearlsHash<char>(str);
	cout << "PearlsHash hashCode = " << hashCode << endl;

	system("pause");
	return 0;
}

注:以上代码是在Win+VS2012中运行

常用的字符串哈希函数 本文将介绍什么是字符串哈希函数,字符串哈希函数常见用法,以及字符串哈希函数的实现原理和常用算法。 阅读详情

相关推荐

MRI脑影像分析从哲学到技术:一文搞懂VBM预处理基本原理(全网最详细解析)

   分析大脑解剖学差异最常用方法之一是基于体素的形态学方法(voxel-based morphometry, VBM)。 VBM的基本思想是测量大脑组织,尤其是灰质的局部浓度的差异。在大脑的每个体素处进行操作,然后在两个或多个实验组之间进行统计比较,从而在受调查的组之间建立特定大脑区域中脑组织浓度的统计学显着差异。 VBM分析基于(高分辨率)MRI脑部扫描,涉及大量处理步骤,主要是空间归一化,分割,平滑和统计分析,最终结果是统计图,显示了各组之间组织类型明显不同的区域[^1]。 参考 [^1] ..

意疏的学习笔记 3万+

字符串哈希(BKDR_Hash)

详讲BKDR_Hash,并用C语言实现简版代码

日常记录,挨打要立正! 9765

Conda换源全攻略:从清华源到默认源的保姆级切换教程(附常见问题解决)

本文提供Conda换源的完整教程,详细讲解如何从清华源切换到默认源,包括配置步骤、常见问题解决方案及高级技巧。针对国内开发者遇到的下载速度慢问题,清华源提供了高速稳定的解决方案,同时文章也介绍了恢复默认源的方法和多种镜像源选择。

weixin_28837817的博客 942

字符串哈希函数

字符串哈希(BKDH-Hash)

2301_81731156的博客 1568

传感器采集信息的频率(采样频率)

较高的采集频率通常能提供更详细的信息,但也会增加数据处理和存储的负担。在某些应用中,较高的采样频率可能是必要的,而在其他情况下,则可能会选择适当的低采样频率以降低功耗和数据处理压力。传感器采集信息的频率(采样频率)是指传感器在一定时间内对输入信号进行采样的次数。对于一些需要快速检测和响应的应用,如运动传感器、声音传感器等,高采样频率是至关重要的。高采样频率通常需要更多的功耗和更大的存储容量,因为产生的数据量更大。例如,对于快速运动的对象,较低的采样频率可能无法捕捉到运动的真实轨迹。

chen的博客 5349

Arduino、ESP32驱动AS3935数字闪电传感器(闪电传感器)

闪电传感器采用AMS独具创新的AS3935数字闪电传感芯片与Coilcraft的MA5532-AE专用天线,可在室内或室外,安全地检测方圆40km范围内发生闪电的距离,闪电相对强度与统计闪电发生次数。

不脱发的程序猿 2017

字符串哈希(HASH)

一个字符串的哈希值。

cgl18973281319的博客 3295

SPAD IMX479规格_VOP

对于VOP的定义,很多人可能是不理解这一路的供电,实际上这一路供电是非常重要的,这是给器件SPAD供电,决定SPAD是否work,在大部分的paper以及大部分公司,基本都是叫VOP,名称是SPAD breakdown voltage power supply,严格意义上叫Operating Voltage,工作电压。当然有些公司也有一些其他叫法就不提了。其实大家可以明显的看出,典型值-20.5没有发生变化,市面上绝大多数VOP的典型值也都是在-20V这边。

致力于lidar应用开发 702

哈希表(二)——哈希函数(字符串哈希算法)

在上一篇文章哈希表的大小提到过一种除留余数法的计算哈希值的函数。这一篇文章来具体说一说,怎么设计哈希函数能够让哈希表更加效率。 哈希函数,是用来计算存储数据的哈希值的,根据存储数据的类型,可以设计不同的哈希函数。一个好的哈希函数(让哈希表效率高的函数),一般都具备下面两个特点: 速度快(别计算一个哈希值计算了半天,导致效率很低,简单高效就好) 能够将得到的哈希值均匀地分布在整个哈希表中,保证...

pigff的博客 2966

关于 Nginx 监听地址 0.0.0.0 的详细解释

0.0.0.0在Nginx配置中表示监听服务器所有网络接口(包括公网IP、内网IP和本地回环地址),这是默认配置。当使用listen 80;时,Nginx会接受通过服务器任何IP地址的80端口访问请求。相比只监听特定IP,这种配置更通用,但也意味着服务会对外网开放,需注意安全风险。可通过netstat命令验证监听状态,显示0.0.0.0:80即表示正确配置。

weixin_43674738的博客 1567

安全与加密常识(10)linux系统证书管理

1. 将自定义CA证书(如my-ca.crt)放到源目录# 2. 编辑配置文件,启用该证书(末尾添加一行 my-ca.crt)# 3. 执行命令同步(核心工作环节)# 4. 验证结果:检查是否生成哈希链接和合并到证书束ls /etc/ssl/certs/my-ca.pem # 证书文件ls /etc/ssl/certs/$(openssl x509 -hash -noout -in /usr/share/ca-certificates/my-ca.crt).0 # 哈希链接。

二进制君 292

[ASCII,散列函数,哈希表,字符串,Hash函数]「译」C语言实现一个简易的Hash table

  我们会讲解Hash函数和实现算法,并手动实现一个Hash函数。   Hash函数   本教程中我们实现的Hash函数将会实现如下操作:   输入一个字符串,然后返回一个0到m(Hash表的大小)的数字为一组平常的输入返回均匀的bucket索引。如果Hash函数不是均匀分布的,就会将多个记录插入到相同的bucket中,这就回提高冲突的几率,而这个冲突就会影响到我们的Hash表的效率。   Hash算法   我们将会设计一个普通的字符串Hash函数,在伪代码中表示如下:   function..

iqifenxia的博客 390

OpenClaw实战-行政与HR必备:AI驱动的办公自动化

智能会议纪要自动生成会议时间智能协调自动提醒和跟进简历智能筛选和匹配度分析面试安排自动化入职办理流程化通知公告一键发布发票识别和报销辅助资产管理数字化让AI处理繁杂的事务性工作,让您有更多时间专注于更有价值的战略和管理任务。

gaoxiang_120的专栏 220

mysql 字符串的hash函数_经典字符串HASH函数

//1. PHP中出现的字符串Hash函数static unsigned long hashpjw(char *arKey, unsigned intnKeyLength){unsigned long h = 0, g;char *arEnd=arKey+nKeyLength;while (arKey < arEnd){h = (h << 4) + *arKey++;if ((g...

weixin_39837352的博客 774

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

String字符串的比较和hash函数减少哈希冲突

使用哈希函数比较字符串:如果确实需要使用哈希函数进行字符串比较,并且要避免哈希冲突,可以选择具有较低冲突率的哈希函数。因此,无论字符串的长度如何,比较哈希值所需的时间是恒定的。而直接比较两个字符串的字符序列的时间是与字符串长度成正比的,当字符串很长时,比较哈希值的效率更高。综上所述,比较两个字符串的哈希值通常比直接比较两个字符串本身更高效,特别是在处理大量字符串或大型数据集时。因此,在实际应用中,为了确保准确性,比较哈希值相等的字符串时,还需要进一步比较它们的原始字符序列以确认它们是否真正相等。

weixin_57128596的博客 1005

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

php 字符 hash_PHP如何生成随机字符串?使用哈希函数

PHP如何生成随机字符串?本篇文章就给大家介绍PHP使用rand()函数+哈希函数生成随机字符串的方法,下面就开始具体内容,希望对大家有所帮助。在PHP中有一些函数,如md5(),sha1()和hash(),可用于根据某些算法来对字符串进行哈希(Hash)处理。哈希函数可以将一个字符串作为参数,然后返回一个哈希字符串。首先我们通过一个简单的是来看看rand()函数+哈希函数如何生成随机字符串。...

weixin_35012431的博客 558

字符串哈希到整数函数,算法

基本概念 所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2)。 设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了)。 在处理大规模字符串数据时,

风叶 2万+

java字符串哈希算法,字符串哈希函数

// 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 & 0x7...

weixin_29619251的博客 777

mysql 字符串的hash函数_若干经典的字符串哈希函数

2经典字符串Hash函数介绍作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数。2.1PHP中出现的字符串Hash函数static unsigned long hashpjw(char *arKey, unsigned int nKeyLength){unsigned long h = 0, g;char *arEnd=arKey+nKeyLength;while (...

weixin_39898550的博客 472

经典字符串HASH函数

//1. PHP中出现的字符串Hash函数      static unsigned long hashpjw(char *arKey, unsigned int nKeyLength) { unsigned long h = 0, g; char *arEnd=arK

千里之行,始于足下 1122

一致性hash算法--字符串哈希函数比较

一个股票交易系统的后台,为了能快速查找各种股票代码的Tick,会计算其哈希值,然后存贮在哈希表里面。一个好的哈希函数应该能实现很好地分布性,减少冲突。这里选取了几种常用的字符串哈希,包括BKDRHash,APHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash和DJBHash,通过在不同的字符串集合测试,来测试其性能。 各种常用算法 一、BKD...

淡淡的倔强的博客 3851

各种字符串Hash函数比较

各种字符串Hash函数比较

欢迎朋友,我是一名十多年开发经验的新手,希望多多指教。 664

字符串哈希 保你能看懂

之前我们都接触过二进制、八进制、十进制、十六进制等等,这个时候,我们可以把字符串也当成一个进制数,比如。值,然后借助 数组排序后比较相邻元素是否相等,可以统计出不同字符串的个数。,字符串内包含数字、大小写字母,大小写敏感),请求出。有了上面的铺垫,这道题就很简单了,计算每个字符串的。答案是可以的,通过观察可·以发现,如果相求字符串。输出包含一行,包含一个整数,为不同的字符串个数。函数,将字符串转成整数,通常可以这样定义。行每行包含一个字符串,为所提供的字符串。是一样的,所以所提供字符串的集合为。

PengFly123的博客 921

程序员必备:字符串哈希函数比较

一个股票交易系统的后台,为了能快速查找各种股票代码的Tick,会计算其哈希值,然后存贮在哈希表里面。一个好的哈希函数应该能实现很好地分布性,减少冲突。这里选取了几种常用的字符串哈希,包括BKDRHash,APHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash和DJBHash,通过在不同的字符串集合测试,来测试其性能。

技术笔记 1万+

hash function 字符串哈希函数

#include <stdio.h> int hash(const char *str) { int sum = 0; for (int i=0;;i++) { if (str[i] == '\0') break; sum += ((int)str[i] * 10 + i); } return sum%2069; } ...

weixin_30914981的博客 162
上一篇: 进程同步及避免死锁经典问题
下一篇: C与C++的区别
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值