用C语言写一个散列函数并解析
时间: 2023-12-29 13:33:59 浏览: 90
当然可以!下面是一个示例的散列函数的C语言实现:
```c
#include <stdio.h>
#include <string.h>
unsigned int hash(char *str) {
unsigned int hash = 5381;
int c;
while ((c = *str++)) {
hash = ((hash << 5) + hash) + c; // djb2 哈希算法
}
return hash;
}
int main() {
char str[100];
printf("请输入要散列的字符串:");
scanf("%s", str);
unsigned int hashedValue = hash(str);
printf("散列结果:%u\n", hashedValue);
return 0;
}
```
这个示例使用了djb2哈希算法,它是一种简单且常用的哈希算法。你可以将要散列的字符串作为输入,然后计算出一个无符号整数作为散列结果。
注意,这只是一个简单的示例,并不是完美的散列函数。实际情况下,你可能需要更复杂和更安全的散列函数来满足特定的需求。在实际应用中,你可能需要考虑散列冲突、数据分布等因素,并选择合适的散列函数。
相关问题
用C语言设计散列表实现电话号码查找系统。设电话号码簿长度为n(0≤n≤10000),系统应该实现如下工作: ⑴ 电话号码簿保存在文件dianhuabu.txt中,每一条电话号码记录包含数据项:编号(唯一),用户名,通信地址,电话号码(手机号) ⑵ 创建散列表:系统运行时,读取文件dianhuabu.txt的电话号码,构建散列表,用于查询。要求:自选散列函数(至少2种),自选解决冲突的方法(至少2种),分别以电话号码和用户名为关键字,建立散列表。 ⑶ 查询:根据输入的用户名,查找并显示给定用户的信息。
好的,我会尽力回答你的问题。首先,我可以给你一个简单的思路设计散列表实现电话号码查找系统。
1. 散列函数的选择:常用的散列函数有除留余数法、平方取中法、折叠法、随机数法等。可以根据实际情况选择适合的散列函数。例如,可以使用电话号码的后四位作为散列函数,也可以使用用户名的首字母的ASCII码值作为散列函数。
2. 解决冲突的方法:常用的解决冲突的方法有开放地址法、链地址法、再散列法等。可以根据实际情况选择适合的解决冲突的方法。例如,可以使用链地址法解决冲突,也可以使用开放地址法解决冲突。
3. 读取文件dianhuabu.txt的电话号码,构建散列表:读取文件dianhuabu.txt,解析每一条电话号码记录,根据所选的散列函数计算散列值,根据所选的解决冲突的方法处理冲突,将每条记录存储到散列表中。
4. 根据输入的用户名,查找并显示给定用户的信息:根据输入的用户名计算散列值,根据所选的解决冲突的方法在散列表中查找对应的记录,如果找到了,就显示该用户的信息,否则提示没有找到该用户的信息。
以上是一个简单的思路,你可以根据实际情况进行相应的实现。
阅读全文