提供下C代码的 HASH算法
时间: 2023-09-22 14:06:23 浏览: 71
### 回答1:
下面是一个简单的 C 语言代码,实现了一种称为 "平方和哈希" 的哈希算法:
```
#include <stdio.h>
#include <string.h>
unsigned long hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
int main(int argc, char *argv[])
{
if (argc != 2) {
printf("Usage: %s string\n", argv[0]);
return 1;
}
printf("%lu\n", hash(argv[1]));
return 0;
}
```
这个代码接受一个字符串作为输入,并使用平方和哈希算法将其转换为一个无符号长整数。哈希算法通常用于快速查找数据,因为它可以将数据映射到一个数字上,使得查找变得更快。
需要注意的是,这只是一个简单的哈希算法,在实际应用中可能不够安全,并且可能存在冲突。如果需要使用哈希算法,建议使用更复杂的哈希算法,如 MD5 或 SHA。
### 回答2:
C 语言代码提供了许多常见的哈希算法,下面给出一种简单的哈希算法示例:
```c
#include <stdio.h>
#include <string.h>
unsigned int hash(const char *str) {
unsigned int hash = 5381;
int c;
while ((c = *str++) != '\0') {
hash = ((hash << 5) + hash) + c;
}
return hash;
}
int main() {
const char *str = "hello";
unsigned int hashValue = hash(str);
printf("哈希值为:%u\n", hashValue);
return 0;
}
```
在这个示例中,我们使用了一个简单的哈希算法,称为“DJB2”。它基于 Dan Bernstein 所设计的哈希函数。
具体的哈希算法实现如下:
1. 初始化哈希值为 5381。
2. 对于字符串中的每个字符,将哈希值进行左移 5 位,然后加上哈希值,并加上当前字符的 ASCII 值。
3. 最后得到的哈希值即为最终的结果。
在示例中,我们测试了字符串 "hello" 的哈希值,并将结果打印出来。
需要注意的是,这只是示例中的一个简单哈希算法,实际应用中可能需要更复杂、更安全的哈希算法。
### 回答3:
C语言中可以使用多种哈希算法,这里我介绍一种常见的哈希算法,即使用求余数法的简单哈希算法。代码如下:
```c
unsigned int simpleHash(char* key, int hashTableSize) {
unsigned int hashValue = 0;
int i = 0;
// 遍历字符串的每个字符
while (key[i] != '\0') {
// 将字符的ASCII码累加到hashValue中
hashValue += key[i];
i++;
}
// 对hashValue进行求余操作,得到最终的哈希值
hashValue = hashValue % hashTableSize;
return hashValue;
}
```
这个简单哈希算法的思路是将字符串key中的每个字符的ASCII码相加,并对哈希表大小进行求余操作得到最终的哈希值。该算法的优点是实现简单、计算速度较快。但是由于只考虑了字符的ASCII码,因此对于不同的字符串,可能会产生冲突,即两个不同的字符串可能会得到相同的哈希值。这个冲突问题可以使用更复杂的哈希算法来解决,如链地址法、开放地址法等。
需要注意的是,此处提供的只是简单的哈希算法示例,实际应用中可能需要根据具体场景选择更合适的哈希算法。另外,将哈希值与哈希表的大小进行求余操作是为了确保哈希值在哈希表范围内,但一般情况下,哈希表的大小应为一个质数,以减少冲突的概率。