ELFhash函数

这是一个很有用的HASH 的函数,对长短字符串都很有用。

代码:

 1 // ELF Hash Function
 2 unsigned int ELFHash(char *str)
 3 {
 4     unsigned int hash = 0;
 5     unsigned int x = 0;
 6
 7     while (*str)
 8     {
 9         hash = (hash << 4) + (*str++);//hash左移4位,把当前字符ASCII存入hash低四位。
10         if ((x = hash & 0xF0000000L) != 0)
11         {
12             //如果最高的四位不为0,则说明字符多余7个,现在正在存第8个字符,如果不处理,再加下一个字符时,第一个字符会被移出,因此要有如下处理。
13             //该处理,如果对于字符串(a-z 或者A-Z)就会仅仅影响5-8位,否则会影响5-31位,因为C语言使用的算数移位
14             //因为1-4位刚刚存储了新加入到字符,所以不能>>28
15             hash ^= (x >> 24);
16             //上面这行代码并不会对X有影响,本身X和hash的高4位相同,下面这行代码&~即对28-31(高4位)位清零。
17             hash &= ~x;
18         }
19     }
20     //返回一个符号位为0的数,即丢弃最高位,以免函数外产生影响。(我们可以考虑,如果只有字符,符号位不可能为负)
21     return (hash & 0x7FFFFFFF);
22 }

ELFhash函数,布布扣,bubuko.com

时间: 2024-10-09 16:41:00

ELFhash函数的相关文章

各种hash函数

public class HashAlgorithms { /** * 加法hash * @param key 字符串 * @param prime 一个质数 * @return hash结果 */ public static int additiveHash(String key, int prime) { int hash, i; for (hash = key.length(), i = 0; i < key.length(); i++) hash += key.charAt(i); re

Hash Compared &amp; ELFHash 详解

部分转载自here 常用HASH算法 代码 & 比较 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞. 常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等.对于以上几种哈希函数,我对其进行了一个小小的评测. Hash函数 数据1 数据

常用字符串Hash函数

几个常用的字符串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); } RSHa

USACO 6.3 Cryptcowgraphy

CryptcowgraphyBrian Dean The cows of Farmer Brown and Farmer John are planning a coordinated escape from their respective farms and have devised a method of encryption to protect their written communications. Specifically, if one cow has a message, s

常见的散列函数

散列函数 在以下的讨论中,我们假设处理的是值为整型的关键码,否则我们总可以建立一种关键码与正整数之间的一一对应关系,从而把该关键码的检索转化为对与其对应的正整数的检索:同时,进一步假定散列函数的值落在0到M-1之间.散列函数的选取原则是:运算尽可能简单:函数的值域必须在散列表的范围内:尽可能使得结点均匀分布,也就是尽量让不同的关键码具有不同的散列函数值.需要考虑各种因素:关键码长度.散列表大小.关键码分布情况.记录的检索频率等等.下面我们介绍几种常用的散列函数. 1.除余法 顾名思义,除余法就是

数据结构与算法分析java——散列

1. 散列的概念 散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中.检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点.通过散列方法可以对结点进行快速检索.散列(hash,也称“哈希”)是一种重要的存储方式,也是一种常见的检索方法. 按散列存储方式构造的存储结构称为散列表(hash table).散列表中的一个位置称为槽(slot).散

字符串哈希函数ELFHash的理解

unsigned long ElfHash ( const unsigned char *name ) { unsigned long   h = 0, g; while ( *name ) { h = ( h << 4 ) + *name++; if ( g = h & 0xF0000000 )//如果最高位不为0,则说明字符已经7个,如果不处理,再加第八个字符时,第一个字符会被移出 //因此要有如下处理是每一个字符都对字符串的值进行影响. h ^= g >> 24;//

Bloom filter的实现以及常用的hash函数

bloom filter利用时间换空间的思想,利用多个哈希函数,将一个元素的存在状态映射到多个bit中,特别是在网络环境中,BF具有广泛的用途,关键问题就是要减少false positive rate(可以设置参数来调节),扩展有 counting BF.这里选用的hash函数是表现较好的 BKDRHash , SDBMHash, DJBHash . Bloom-filter代码: bloom_filter.h #ifndef __BLOOM_FILTER_H__ #define __BLOOM

几种哈希函数的比较

基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 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称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID.这就需要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数呢?有