哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。
链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。
设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响,然 而Hash函数是Hash链表最核心的部分,下面是几款经典软件中使用到的字符串Hash函数实现,通过阅读这些代码,我们可以在Hash算法的执行效率、离散性、空间利用率等方面有比较深刻的了解。
下面分别介绍几个经典软件中出现的字符串Hash函数。
●PHP中出现的字符串Hash函数
static unsigned long hashpjw(char *arKey, unsigned int nKeyLength)
{
unsigned long h = 0, g;
char *arEnd=arKey+nKeyLength;
while (arKey < arEnd) {
h = (h << 4) + *arKey++;
if ((g = (h & 0xF0000000))) {
h = h ^ (g >> 24);
h = h ^ g;
}
}
return h;
}
●OpenSSL中出现的字符串Hash函数
unsigned long lh_strhash(char *str)
{
int i,l;
unsigned long ret=0;
unsigned short *s;
if (str == NULL) return(0);
l=(strlen(str)+1)/2;
s=(unsigned short *)str;
for (i=0; i
ret^=(s[i]<<(i&0x0f));
return(ret);
}
/* The following hash seems to work very well on normal text strings
* no collisions on /usr/dict/words and it distributes on %2^n quite
* well, not as good as MD5, but still good.
*/
unsigned long lh_strhash(const char *c)
{
unsigned long ret=0;
long n;
unsigned long v;
int r;
if ((c == NULL) || (*c == '\0'))
return(ret);
/*
unsigned char b[16];
MD5(c,strlen(c),b);
return(b[0]|(b[1]<<8)|(b[2]<<16)|(b[3]<<24));
*/
n=0x100;
while (*c)
{
v=n|(*c);
n+=0x100;
r= (int)((v>>2)^v)&0x0f;
ret=(ret(32-r));
ret&=0xFFFFFFFFL;
ret^=v*v;
c++;
}
return((ret>>16)^ret);
}
●MySql中出现的字符串Hash函数
#ifndef NEW_HASH_FUNCTION
/* Calc hashvalue for a key */
static uint calc_hashnr(const byte *key,uint length)
{
register uint nr=1, nr2=4;
while (length--)
{
nr^= (((nr & 63)+nr2)*((uint) (uchar) *key++))+ (nr << 8);
nr2+=3;
}
return((uint) nr);
}
/* Calc hashvalue for a key, case indepenently */
static uint calc_hashnr_caseup(const byte *key,uint length)
{
register uint nr=1, nr2=4;
while (length--)
{
nr^= (((nr & 63)+nr2)*((uint) (uchar) toupper(*key++)))+ (nr << 8);
nr2+=3;
}
return((uint) nr);
}
#else
/*
* Fowler/Noll/Vo hash
*
* The basis of the hash algorithm was taken from an idea sent by email to the
* IEEE Posix P1003.2 mailing list from Phong Vo (kpv@research.att.com) and
* Glenn Fowler (gsf@research.att.com). Landon Curt Noll (chongo@toad.com)
* later improved on their algorithm.
*
* The magic is in the interesting relationship between the special prime
* 16777619 (2^24 + 403) and 2^32 and 2^8.
*
* This hash produces the fewest collisions of any function that we've seen so
* far, and works well on both numbers and strings.
*/
uint calc_hashnr(const byte *key, uint len)
{
const byte *end=key+len;
uint hash;
for (hash = 0; key < end; key++)
{
hash *= 16777619;
hash ^= (uint) *(uchar*) key;
}
return (hash);
}
uint calc_hashnr_caseup(const byte *key, uint len)
{
const byte *end=key+len;
uint hash;
for (hash = 0; key < end; key++)
{
hash *= 16777619;
hash ^= (uint) (uchar) toupper(*key);
}
return (hash);
}
#endifMysql中对字符串Hash函数还区分了大小写
●另一个经典字符串Hash函数
unsigned int hash(char *str)
{
register unsigned int h;
register unsigned char *p;
for(h=0, p = (unsigned char *)str; *p ; p++)
h = 31 * h + *p;
return h;
}
分享到:
相关推荐
在压缩包文件"geo"中,可能包含了GeoHash算法的Java实现源代码、测试用例和其他相关资源。通过分析这些代码,我们可以深入理解GeoHash算法的工作原理,并且学习如何在实际项目中应用它。 GeoHash算法的使用场景广泛...
在本文中,我们将探讨几种经典哈希算法的实现,包括PHP、OpenSSL和MySQL中的字符串哈希函数。 1. PHP中的哈希函数(hashpjw) PHP使用了一个名为hashpjw的函数,由Peter J. Weinberger设计。该函数采用移位和异或...
总之,这个压缩包提供的加密算法源代码集合是一个宝贵的资源,对于学习者、开发者和安全专家来说,都是一个难得的学习和实践平台。无论是为了提高安全意识,还是为了深入研究加密技术,这些源代码都能提供丰富的启示...
为了更好地理解并实现GeoHash算法,你可以参考`geoHash`压缩包中的源代码,它可能包含了实现GeoHash功能的类和方法。通过阅读和学习这些代码,你可以深入理解GeoHash的工作原理,并将其应用于自己的项目中。同时,...
本项目提供了使用C语言实现RSA算法的源代码,下面将详细介绍RSA算法及其在C语言中的实现。 RSA算法的核心原理基于两个大素数的乘积难以因式分解的数学难题。它涉及到以下几个关键步骤: 1. 密钥生成: - 选择两个...
C语言源代码通常会包含以下几个关键部分: 1. **初始化**:定义五个中间变量(A, B, C, D, E),并设置初始值。这些值是固定的,对应于SHA1算法的初始化常量。 2. **预处理**:首先,原始数据需要通过补零和添加...
在提供的源代码中,`hSearch(const K& k)`函数就实现了简单的取模运算作为哈希函数,`k % D`,其中`D`是哈希表的大小,即散列的基数。 2. **冲突处理**:由于哈希函数可能会导致不同的关键字映射到同一个位置,因此...
在实际的C# RSA源代码中,通常会包括以下几个关键步骤: 1. **生成密钥对**:使用RSACryptoServiceProvider类的GenerateKeyPair方法生成一对公钥和私钥。 2. **保存和加载密钥**:可以通过Save和Load方法将密钥保存...
`Hash.cpp` 文件很可能是实现这个简易Hash算法的C++源代码。在这个文件中,我们可以预期找到一个或多个函数,这些函数接收一个字符串或者其他类型的数据作为输入,并返回一个哈希值。函数的实现可能包括基本的算术...
在提供的压缩包文件中,"Md5"可能是源代码文件的名字,它很可能包含了MD5算法的实现。这个源码文件可能会包含类或者函数,用于处理输入数据并计算MD5摘要。用户可以通过调用这些函数,传递需要计算的字符串或文件,...
提供的压缩包文件“哈希摘要算法编程”可能包含了上述几种哈希算法的源代码实现,可供学习和参考。通过分析这些源代码,可以深入了解哈希函数的工作原理,以及如何在实际项目中应用它们。对于理解和提升在信息安全、...
本文将深入探讨几种典型的密码算法,并结合C语言实现,帮助读者理解这些算法的内部工作原理和编程实现。以下是对这些典型密码算法的详细介绍: 1. **DES(Data Encryption Standard)数据加密标准**:DES是一种对称...
通过分析这些源代码,我们可以深入探讨几种常见的MAC算法,例如HMAC(Hash-based Message Authentication Code)、CMAC(Cipher-based Message Authentication Code)和PMAC(Parallelizable Message Authentication...
在"Hashtable[1].pas.txt"这个源代码文件中,很可能是采用了一种或多种冲突解决策略。 在Delphi中,哈希表的实现可能包括以下几个关键部分: 1. **哈希函数(Hash Function)**:这是将键转换为数组索引的关键算法...
在给定的压缩包文件中,可能包含了完整的C++源代码实现,你可以通过阅读和分析这段代码来深入理解SHA1算法的细节。代码通常会包含注释,解释每一步的逻辑,这对于初学者来说是很好的学习资源。如果你在实现自己的SHA...
压缩包中的"study-hash3"文件可能是源代码文件,包含博主实现的TOPK算法的哈希版本。通过阅读和分析这个文件,可以进一步了解算法的具体实现细节,如哈希表的结构、堆的管理等。 总的来说,TOPK算法的哈希实现是一...
在提供的压缩包中,只有一个名为"md5"的文件,这可能是一个包含MD5算法实现的C++源代码文件,或者是编译后的二进制可执行文件。如果是源代码文件,我们通常期望看到定义了计算MD5哈希的函数,如`MD5Hash`,以及可能...
- `hash_modify.c`是实际实现哈希算法的源代码文件,可能包含哈希表的定义、哈希函数的实现、冲突解决策略的实现等。 - 在C语言中,通常会用结构体(struct)来表示哈希表,其中包含数组(或指针)和元素个数等...
在压缩包中的`sha256core`文件很可能包含了SHA-256算法的实现源代码,可能是用C++或其他语言编写的。通过阅读和理解这段代码,可以深入理解SHA-256算法的内部工作原理,这对于理解和实现密码学安全相关的应用至关...