各种字符串Hash函数比较

2023-11-16

转自 beyond the void

常用的字符串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效果最差,但得分相似,其算法本质是相似的。

附:各种哈希函数的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 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 );
}

// 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 );
}

转载于:https://www.cnblogs.com/ltang/archive/2011/04/24/2026456.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

各种字符串Hash函数比较 的相关文章

  • C#中unsafe的使用

    1 unsafe在C 程序中的使用场合 实时应用 采用指针来提高性能 引用非 net DLL提供的如C 编写的外部函数 需要指针来传递该函数 调试 用以检测程序在运行过程中的内存使用状况 2 使用unsafe的利弊 好处是 性能和灵活性提高
  • 每天都在谈SOA和微服务,但你真的理解什么是服务吗?

    近几年来 我一直从事着和面向服务相关的底层软件研发工作 逐渐的形成了一些自己的看法 其中我觉得比较重要的看法就是服务需要一个更准确细致的定义 简单来说 服务的本质就是行为 业务活动 的抽象 为了更好的阐述新服务的概念 并方便与传统的SOA中
  • C/C++语言实现WiFi(socket)数据收发(客户端和服务端)

    目录 客户端 client 服务端 server C C 实现TCP通信 接收WIFI数据 编程环境 VC 6 0 手机端 使用WiFi调试助手 提示 整个过程在局域网中进行 很多编程语言都可以实现socket通信 本博客将通过C C 实现
  • fastcgi的环境变量

    FCGI ROLE RESPONDER SCRIPT FILENAME scripts 5 cgi QUERY STRING aaa 11111111111111 bbb 2222222222222222 ccc 3333333333333
  • Qt5学习之路(vs2012下创建一个QT应用程序)2013-10-14

    刚开始学习QT在网上找的资料基本都是使用QT Create进行开发的 VS下开发的学习资料感觉很少很难找的到 视频教程也基本没看到过貌似 因为我们研发中心是使用MFC进行开发开发工具是VS2010 使用QT开发的话基本我们不会再使用QT C
  • C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式 在IEEE754中 单精度浮点数有如下形式 32位单精度 单精度二进制小数 使用32个比特存储 1 8 23位长 S Exp Fraction 31 30至23偏正值 实际的指数大小 127 22至0位编号 从右边
  • 大端模式和小端模式转化

    在工作中遇到一个问题 数据是以大端模式存储的 而机器是小端模式 必须进行转换 否则使用时会出问题 一 定义 大端模式 Big Endian 数据的高字节 保存在内存的低地址中 数据的低字节 保存在内存的高地址中 小端模式 Little En
  • C/C++ 引用作为函数的返回值

    语法 类型 函数名 形参列表 函数体 特别注意 1 引用作为函数的返回值时 必须在定义函数时在函数名前将 2 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 代码来源 RUNOOB include
  • 经典面试题之new和malloc的区别

    new和malloc的区别是C C 一道经典的面试题 我也遇到过几次 回答的都不是很好 今天特意整理了一下 0 属性 new delete是C 关键字 需要编译器支持 malloc free是库函数 需要头文件支持 1 参数 使用new操作
  • LeetCode题目笔记——17.19消失的两个数字

    文章目录 题目描述 题目难度 困难 方法一 暴力 代码 代码优化 方法二 数学方法 代码 总结 题目描述 题目直达 题目难度 困难 方法一 暴力 虽然题目说你能在 O N 时间内只用 O 1 的空间找到它们吗 但是也没有限制我们不能用暴力
  • mfc窗口创建的create与oncreate

    在view类中 create 是虚函数由框架调用 是用来 生成一个窗口的子窗口 oncreate 消息响应函数 是用来 表示一个窗口正在生成 某个CWnd的Create函数由当前CWnd的Owner调用 而在CWnd Create中 又会调
  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • visual studio 一直显示正在准备解决方案

    首先重启电脑 无法解决的情况下执行以下步骤 Kill Visual Studio Open Visual Studio without loading a solution Disable AnkhSvn as Source Control
  • stat 函数解析

    stat 函数的简单使用 stat 函数是用来获取文件的各种属性的一个linux下的常用API函数 函数原型为int stat const char path struct stat buf stat定义如下 struct stat dev
  • 一个简单的参数帮助框架,c实现

    文章目录 具体实现如下 include
  • C 语言教程:数据类型和格式说明符

    C 语言中的数据类型 C 中的变量必须是指定的 数据类型 并且您必须在 printf 函数中使用 格式说明符 来显示它 创建变量 int myNum 5 整数 没有小数点 float myFloatNum 5 99 浮点数 char myL
  • C++ 字符串比较------strcmp函数和strncmp函数

    strcmp 函数原型 int strcmp const char str1 const char str2 功能 strcmp函数会按照字典顺序逐个比较两个字符串的字符 直到遇到不同的字符或者遇到字符串结束符 0 返回值 该函数返回值如下
  • C++ 中 const 和 constexpr 关键字解析:常量、函数和指针

    很多 C 的初学者看到 const 这个关键字的第一反应都是一头雾水 主要是因为 const 可 以出现在很多的位置 以及后面加入的 constexpr 更是常常感到困惑 今天就为大家一一解释出现它们的含义和以及作用 const 关键字 c
  • 在 OS X 上的 virtualenv 中安装 scrapy 加密时发生错误 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在安装 scrapypip in virtualenv on OS X 10 11 当它安装密码学时 它说 buil
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC

随机推荐

  • EXCEL常用小技巧系列03----合并单元格筛选

    在EXCEL中 若存在合并单元格 我们直接点击筛选的时候只能显示一列的筛选值 无法全部选出来 因此需要做下简单的处理 数据表 若直接筛选 选出结果如下 如筛选楼层为二楼 只能显示一条数据 处理步骤如下 一 复制合并单元格列即A列至E列 二
  • python matplotlib从文件中读取数据绘制折线图

    说明 从文件中读取数据 绘制直线图 coding utf 8 import matplotlib pyplot as plt import matplotlib as mpl import numpy as np from matplotl
  • 开发者需要知道的十几个网站

    对于开发者来说 什么最重要 当然资源最重要 每天我们需要查询大量的资料来完成我们的工作 任务 如果有网站能够对这些资源进行分类 不仅利于我们查询还有利于学习 形成知识体系 这里提供一些我个人用到的网站 分享给大家 这里有不同开发者的导航网站
  • npm install 、npm install --production 、npm install --save 、 npm install --save-dev

    首先四个都会下载js包到moudles里面 只是package json里面不同 npm install 安装所有依赖 npm install production 安装生产依赖 npm install xx save 安装XX到生产环境依
  • 01-Python的基本概念

    01 Python的基本概念 Python是一种直译式 Interpreted 面向对象 Object Oriented 的程序语言 它拥有完整的函数库 可以协助轻松地完成许多常见的工作 所谓的直译式语言是指 直译器 InteIpretor
  • oracle知识整理

    目录 语句1 建立表格语句 语句2 插入数据语句 语句3 查询表格表结构 语句4 查询表格的所有数据 语句5 表格插入多行新的数据 语句6 登陆oracle 语句7 删除整个表格语句 语句1 建立表格语句 create table CONT
  • 大数据之hbase_hbase的介绍及安装

    hbase简介 hbase是一个用以储存结构化和非结构化数据的分布式列式存储数据库 传统数据库mysql 单节点储存 储存容量小 且是行式储存 当我们需要查询某一个字段的所有数据时 需要将全表都加载一遍 而列式数据库则不需要 大大加快了查询
  • 大厂常见笔试题 滑动窗口内数的和

    大厂常见笔试题 我以为出一个很难的题 结果出了一个基础题 给你一个大小为n的整型数组和一个大小为k的滑动窗口 将滑动窗口从头移到尾 输出从开始到结束每一个时刻滑动窗口内的数的和 样例 对于数组 1 2 7 8 5 长度为n 滑动窗口大小k
  • TCP/IP编程之SO_REUSEADDR和SO_REUSEPORT套接字选项

    基本概念 SO REUSEADDR套接字选项能起到以下4个不同的功用 1 SO REUSEADDR允许启动一个监听服务器并捆绑众所周知端口 即使以前建立的该端口用作它们的本地端口的连接仍存在 这个条件通常是这样碰到的 a 启动一个监听服务器
  • 滤波电容的选择

    滤波电容的选择 理论部分 参考案例 一 参考案例 二 其他案例 理论部分 滤波电容主要看容值和耐压值 电容尺寸 容值x耐压值 电容价格 容值x耐压值 电解和钽电容耐压值要x2倍使用 陶瓷电容至少x1 5倍使用 电容选择的逻辑是频率越高 电容
  • 编译Linux内核的一些报错

    内核版本3 18 6 编译目标架构为x86 64 硬件实际架构为x86 64 1 error code model kernel does not support PIC mode 修改 kernel path arch x86 Makef
  • 微信小程序-获取用户手机号码

    1 在获取手机号码之前 要先进行登陆 使用wx login进行登录 登录成功会返回一个code 将code传给后台 获取登录密钥session key等信息 将这些信息存入data 2 使用type getPhoneNumber 的butt
  • 快速fcm matlab,Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自 http xiaozu renren com xiaozu 106512 336681453 function center U obj fcn FCMClust data cluster n
  • 【日积月累】后端刷题日志

    刷题日志 说说对Java的理解 JAVA中抽象类和接口之间的区别 Java中的泛型 和equals 的区别 八种基本数据类型与他们的包装类 在一个静态方法内调用一个非静态成员为什么是非法的 静态方法与实例方法有何不同 重载与重写 深拷贝浅拷
  • Sqli-labs 博客目录

    之前学习了一遍 sqli labs 这是巩固复习一遍 代码全部手敲 加深印象 Sqli labs 博客目录 Sqli labs Less01 04 基于错误的sql注入 GET Sqli labs Less05 06 报错型sql盲注 GE
  • 第12章 K8s进阶篇-细粒度权限控制

    12 1 什么是RBAC 负责k8s整个集群控制的 不同人员权限的管控 开发 测试 管理员等 12 2 RBAC配置解析 12 3 RBAC常用配置示例 参考官方文档 使用 RBAC 鉴权 Kubernetes 正常是通过yaml文件创建
  • 替代空格

    include
  • host文件的工作原理及应用

    host文件的工作原理及应用 Hosts文件是一个用于存储计算机网络中节点信息的文件 它可以将主机名映射到相应的IP地址 实现DNS的功能 它可以由计算机的用户进行控制 一 Hosts文件基本介绍 Hosts文件的存储位置在不同的操作系统中
  • java 16进制与字符串互相转

    字符串转换成为16进制 无需Unicode编码 param str return public static String str2HexStr String str char chars 0123456789ABCDEF toCharAr
  • 各种字符串Hash函数比较

    转自 beyond the void 常用的字符串Hash函数还有ELFHash APHash等等 都是十分简单有效的方法 这些函数使用位运算使得每一个字符都对最后的函数值产生影响 另外还有以MD5和SHA1为代表的杂凑函数 这些函数几乎不