查找字符串的哈希方法
比较经典的字符串hash,相信很多使用C的都使用过了吧。
转贴同学redor的一篇文章,感觉很有用。
// 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 ) << (BitsInU
nignedInt - 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 );
}
// SDBM Hash Function
unsigned int SDBMHash( char * str)
{
unsigned int hash = 0 ;
while ( * str)
{
hash = ( * str ++ ) + (hash << 6 ) + (hash << 16 ) - hash;
}
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 );
}
比较经典的字符串hash就这些了吧,"ELF Hash Function" <-这个比较常用..
分享到:
相关推荐
字符串哈希函数是一种在计算机科学中用于快速查找和比较字符串的有效方法。它的核心思想是将一个字符串转换为一个整数值,这个数值可以作为字符串的一种紧凑表示,便于存储、比较和查找。在本实验中,我们将关注如何...
字符串哈希函数是计算机科学中一个重要的数据结构和算法,主要用于快速查找和处理字符串。哈希函数将一个字符串转换为一个固定大小的数值,这个数值称为哈希值。哈希函数的设计目标是使得不同的字符串得到不同的哈希...
字符串哈希Key算法是计算机科学中一种用于快速查找和存储字符串的重要技术。它通过将字符串转化为固定长度的数值,即哈希值,使得在大量数据中查找特定字符串变得高效。这种算法广泛应用于数据库索引、缓存系统、...
这个名为`FindChar.java`的程序实现了查找字符串中出现重复次数最多的字符的功能。通过调用`findMostFrequentChar`方法并传入字符串,我们可以获取出现频率最高的字符。在`main`方法中,我们给出了一个测试例子,...
在编程语言中,查找字符串的方法多种多样,下面我们将深入探讨几种常见的方法: 1. **线性搜索**:这是最基础的字符串查找方法,它遍历整个文本,逐个字符比较目标字符串。如果找到匹配的字符串,就返回其位置。...
本文档主要介绍了一种通过哈希函数处理字符串问题的方法,并具体应用到了一个特定场景:计算一个字符串在一个旋转矩阵中的出现次数。该方法的核心在于利用了三个不同的哈希值来确保结果的准确性与效率。 #### 基本...
字符串哈希算法是一种将任意长度的字符串映射到固定长度哈希值的算法,通常用于快速查找、数据索引和内存管理等。在计算机科学中,哈希函数的设计至关重要,因为它直接影响到哈希表的性能。本文将探讨几种经典的字符...
这里的`InStr`函数用于查找字符串`searchText`在`item`中首次出现的位置,`vbTextCompare`参数确保了不区分大小写的搜索。 然而,这种方法在大量数据下可能会显得效率低下,因为它涉及到逐项检查。为提高性能,我们...
Rabin-Karp算法则运用了哈希函数,通过计算字符串的哈希值来快速缩小搜索范围。 `CIVStringSet_Demo.zip`中的示例程序可能会展示如何使用这个自定义字符串类进行搜索操作,而`CIVStringSet_Source.zip`则包含了源...
在字符串查找算法方面,此程序可能采用了几种常见的方法: 1. **线性搜索**:这是最基本的搜索方法,逐个字符比较目标字符串。虽然简单,但效率较低,尤其是当文本文件很大时。 2. **KMP(Knuth-Morris-Pratt)...
7. **字符串哈希**:哈希函数可以快速地对字符串进行求值,如Rabin-Karp哈希,用于快速检测两个字符串是否相等。FNV(Fowler-Noll-Vo)哈希和DJB2哈希也是常见的字符串哈希算法。 8. **Manacher's Algorithm**:...
由于C语言标准库中提供了诸如`strlen`、`strcpy`、`strcat`等基本的字符串操作函数,但有时我们需要实现更特定的功能,例如查找字符串中的重复字符或连接多个字符串。下面我们将深入探讨这些自定义的字符串处理函数...
7. **优化技巧**:在实现时,还可以考虑其他优化策略,如使用局部化字符串查找(只在最近的元素中查找),预计算部分结果,或者使用启发式方法减少搜索空间。 8. **C++11及更高版本的新特性**:C++11引入了右值引用...
5. **成员函数**:`HashMapString`类可能包括`insert`(插入字符串)、`find`(查找字符串)、`remove`(删除字符串)等操作,以及可能的`resize`(调整哈希表大小)和`hash_function`(查看或修改哈希函数)等辅助...
【哈希函数与字符串问题】 哈希函数在信息技术领域...综上所述,哈希函数是解决字符串问题的有效工具,尤其是在计算概率和查找相似字符串时。通过巧妙地利用哈希值,我们可以高效地处理大量数据,从而解决复杂的问题。
在计算机科学领域,字符串查找与替换是编程中常见的任务,特别是在文本处理、数据处理和文本编辑器等应用中。这个程序设计课程设计的目标是让学生掌握如何有效地实现这些功能,理解其背后的算法,并能够应用于实际...
在本实验报告中,我们将设计并实现一个哈希表,用于存储和查找字符串。 哈希表的基本概念 哈希表是一种基于键值对的数据结构,它可以快速地存储和查找数据。哈希表的基本概念包括: * 键(Key):用于标识数据的...
2. **平均取中法**:这种方法是将输入字符串的中间字符或中间几个字符的组合作为哈希值。如果字符串长度不一致,可以通过取平均值来调整。这在处理长度差异较大的字符串时有一定的效果。 3. **分段叠加法**:将输入...
Java语言程序设计:数组、字符串、向量与哈希表 Java语言程序设计的第四章中,讨论了数组、字符串、向量与哈希表等数据结构。下面是本章的知识点总结: 一、数组 * 数组是一种静态的数据结构,元素类型相同,占用...