字符串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中运行

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

相关推荐

ENVI新手避坑指南:手把手教你搞定遥感影像的坐标系转换(附ArcGIS对比)

本文详细解析ENVI与ArcGIS在遥感影像坐标系转换中的关键差异与实战技巧,特别针对新手常见问题提供避坑指南。从基础概念到高级操作,涵盖定义投影、UTM转换等核心步骤,并对比两种软件的处理精度与效率,帮助用户高效完成遥感影像处理任务。

weixin_42531925的博客 380

字符串哈希(BKDR_Hash)

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

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

图解转置卷积原理

声明:本文大部分搬运自【机器学习】详解 转置卷积 (Transpose Convolution) 感谢博主花与人间事同,本人只是在博主原创文章上做补充以及添加一些自己的理解。 1 转置卷积的背景 通常,对图像进行多次卷积运算后,特征图的尺寸会不断缩小。而对于某些特定任务 (如图像分割和图像生成等),需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作,称为上采样 (Upsample),如下图所示: 上采样方法有很多,详见【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值

laonafahaodange的博客 5686

字符串哈希函数

字符串哈希(BKDH-Hash)

2301_81731156的博客 1568

grpc安装与简单demo测试

grpc安装: 由于工作需要,最近在学google的rpc开源框架;由于本人菜鸟一枚,而且是从Windows开发转到Linux;由于之前版本控制使用的是svn,没有使用过git,所以从GitHub上下载代码是通过浏览器下载zip格式的压缩文件,折腾了好几天了,发现了各种坑,各种缺少库,各种不知道怎么把这个库给装机器上。对于一个不熟悉Linux的人来说,这个体验简直糟糕透了。没办法了又在机器上装了...

old__captain的博客 4834

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

字符串哈希(HASH)

一个字符串的哈希值。

cgl18973281319的博客 3295

openpi 入门教程(一)安装、训练、微调与推理

OpenPI是由物理智能团队发布的机器人开源模型和软件包,包含两种主要模型:基于流的扩散视觉-语言-动作模型(VLA)的π₀模型和基于FAST动作标记器的自回归VLA的π₀-FAST模型。这些模型已在超过10,000小时的机器人数据上进行了预训练,并提供了基础模型检查点,支持开箱即用或根据用户数据集进行微调。OpenPI的实验性质意味着它可能不适用于所有平台,但鼓励研究人员和从业者进行创造性实验。运行这些模型需要至少具备NVIDIA GPU,推荐使用RTX 4090或更高规格的显卡。OpenPI支持在Ubu

2506_90492529的博客 5113

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

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

pigff的博客 2966

基于深度学习YOLOv8的商品识别系统(深度学习 + UI界面 + 训练数据集 + Python代码)

如果使用自定义数据集,可以通过图像标注工具如LabelImg来标注每个商品的类别和边界框,并保存为YOLO格式的文本文件。bash复制编辑/dataset/images/train/val/labels/train/val这样,我们就准备好了数据集,可以开始训练YOLOv8模型。本文介绍了如何使用YOLOv8构建一个商品识别系统,包括从数据准备到模型训练,再到UI界面的开发。通过深度学习技术,尤其是YOLOv8的高效目标检测能力,我们能够快速实现商品识别并集成到实际应用中。

YOLO 303

【实战教程】BMAD-METHOD 入门教程:用 AI 组建你的“七人开发团队”

简单说,BMAD-METHOD 就像一个会自己运转的“AI 软件公司”。它不是某个单一应用,而是一种AI 工作流方法论—— 把一个项目拆解成多个角色(产品、架构、前后端、测试、运维等),每个角色由一个 AI 智能体负责协作,就像你真的在带一个 7 人团队。GitHub 项目地址 👉目前 Star 数已经达到了恐怖的 20k,可见这套方法的影响力不小。BMAD-METHOD 的核心理念不是“生成代码”,而是“自动化协作”。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1625

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

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

iqifenxia的博客 390

Kappa函数:测量一致性并计算置信区间的R语言包

Kappa函数是一种常用的统计量,用于衡量两个评估者之间的一致性。在R语言中,有一个名为"vcd"的包提供了计算Kappa函数以及相应的置信区间的功能。本文将介绍如何使用"vcd"包来计算Kappa函数的值,并进一步计算置信区间。Kappa函数的值介于-1和1之间,值越接近1表示评估者之间的一致性越高,值越接近-1表示评估者之间的一致性越低,值接近0表示评估者之间的一致性接近于随机。通过以上步骤,我们成功地使用R语言中的"vcd"包计算了Kappa函数的值和置信区间。接下来,我们可以使用"vcd"包中的。

2301_79331230的博客 1877

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

weixin_57128596的博客 1005

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

weixin_35012431的博客 558

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

基本概念 所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 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、付费专栏及课程。

余额充值