常用字符串Hash函数
2015-08-10 13:35
316 查看
几个常用的字符串Hash函数如下:
SDBMHash函数
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); }
RSHash函数
// 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); }
JSHash函数
// JS Hash Function unsigned int JSHash(char *str) { unsigned int hash = 1315423911; while (*str) { hash ^= ((hash << 5) + (*str++) + (hash >> 2)); } return (hash & 0x7FFFFFFF); }
PJWHash函数
// 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); }
ELFHash函数
// 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); }
BKDRHash函数 (推荐)
// 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); }
DJBHash函数
// DJB Hash Function unsigned int DJBHash(char *str) { unsigned int hash = 5381; while (*str) { hash += (hash << 5) + (*str++); } return (hash & 0x7FFFFFFF); }
APHash函数
// 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); }
相关文章推荐
- 矩阵hash + KMP - UVA 12886 The Big Painting
- 数据库事务操作+数据库事务隔离级别
- iOS 多线程
- 从网络上下载文件到本地
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- SparkException: Failed to get broadcast (TorrentBroadcast)
- leetcode 111 —— Minimum Depth of Binary Tree
- wcf中的File-less Activation
- poj 2774
- postgresql数据库psql控制台操作命令
- construct express
- jquery 回车事件
- Hive表数据导入到Hbase
- 利用双缓冲消除图片重画的闪烁现象
- leetCode #232 Implement Queue using Stacks
- python生成随机用户名及密码方法
- Git Stash用法,方便临时处理bug时随时切换分支而不丢失修改
- Total Command help
- 资源链接(持续更新)
- SqlServer 数据库负载均衡【转】