c++中hash函数
时间: 2024-01-03 17:57:11 浏览: 142
C语言中的哈希函数可以使用许多不同的算法实现,具体取决于你的需求。下面是一些常见的C语言中使用的哈希函数算法。
1. 直接寻址法(Direct Addressing):使用一个数组来存储键值对,将键作为数组的索引。适用于键值范围较小且分布均匀的情况。
2. 除留余数法(Division Method):将键除以一个素数,并取余数作为哈希值。常见的素数选择有表长(哈希表大小)或者接近表长的最大素数。
3. 乘法哈希法(Multiplication Method):将键与一个介于0和1之间的常数乘积的小数部分乘以表长,然后向下取整。常用常数选择是0.618。
4. 平方取中法(Mid-square Method):将键的平方取中间的几位作为哈希值。虽然简单,但由于可选位数有限,可能会导致冲突。
这只是一些常见的哈希函数算法,你可以根据需求选择适合你的场景的哈希函数。还有其他更复杂的算法,如开放地址法、链地址法等,可以根据具体情况进行选择。
相关问题
c++hash函数头文件
C++ 中的哈希函数有很多种,但是没有一个标准的哈希函数库。不过,C++11 引入了一个新的哈希函数头文件 `functional` ,其中定义了两个模板类 `hash` 和 `hash_combine` ,可以用于自定义哈希函数。
以下是使用 `functional` 头文件定义哈希函数的示例代码:
```c++
#include <iostream>
#include <string>
#include <functional>
using namespace std;
struct Person {
string name;
int age;
};
class PersonHash {
public:
size_t operator()(const Person& p) const {
return hash<string>()(p.name) ^ hash<int>()(p.age);
}
};
int main() {
unordered_map<Person, int, PersonHash> m;
Person p1{"Alice", 20};
Person p2{"Bob", 25};
m[p1] = 1;
m[p2] = 2;
cout << m[p1] << endl;
cout << m[p2] << endl;
return 0;
}
```
在上面的示例代码中,我们定义了一个结构体 `Person` ,包含两个属性 `name` 和 `age` 。然后我们定义了一个类 `PersonHash` ,其中重载了圆括号运算符 `operator()` ,用于计算 `Person` 对象的哈希值。在 `operator()` 中,我们使用了 `hash` 模板类的默认哈希函数来计算 `name` 和 `age` 的哈希值,并使用异或运算符 `^` 将它们合并成一个哈希值。
最后,我们使用 `unordered_map` 容器来存储 `Person` 对象和对应的值,并使用自定义的哈希函数类 `PersonHash` 作为容器的第三个模板参数。
c++hash函数实现
以下是一个简单的C++哈希函数实现:
```c++
unsigned int hashFunction(const std::string& str)
{
unsigned int hash = 5381;
for (char c : str)
{
hash = ((hash << 5) + hash) + c; // hash * 33 + c
}
return hash;
}
```
该哈希函数使用了一个常见的算法,称为djb2算法。它将字符串转换为一个32位无符号整数哈希值。该算法使用一个称为“乘以33”的魔数,这是因为33是一个奇素数,可以确保哈希函数的均匀性。
阅读全文