用c语言写hash过滤算法
时间: 2023-03-19 07:23:44 浏览: 85
下面是一个基于C语言的简单哈希过滤算法实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100000 // 哈希表最大容量
#define PRIME 31 // 哈希函数使用的质数
typedef struct node {
char* key;
struct node* next;
} node;
node* hash_table[MAX_SIZE]; // 哈希表数组
// 哈希函数
unsigned long hash(char* str) {
unsigned long hash = 0;
int i;
for (i = 0; str[i] != '\0'; i++) {
hash = (hash * PRIME) + str[i];
}
return hash % MAX_SIZE;
}
// 向哈希表中插入一个元素
void insert(char* key) {
unsigned long index = hash(key);
node* new_node = (node*) malloc(sizeof(node));
new_node->key = strdup(key);
new_node->next = NULL;
if (hash_table[index] == NULL) {
hash_table[index] = new_node;
} else {
node* curr = hash_table[index];
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = new_node;
}
}
// 在哈希表中查找一个元素,找到返回1,否则返回0
int search(char* key) {
unsigned long index = hash(key);
node* curr = hash_table[index];
while (curr != NULL) {
if (strcmp(curr->key, key) == 0) {
return 1;
}
curr = curr->next;
}
return 0;
}
int main() {
// 读入一些字符串,插入到哈希表中
insert("hello");
insert("world");
insert("this");
insert("is");
insert("a");
insert("test");
// 查找哈希表中的一些字符串
printf("%d\n", search("hello"));
printf("%d\n", search("world"));
printf("%d\n", search("this"));
printf("%d\n", search("is"));
printf("%d\n", search("a"));
printf("%d\n", search("test"));
printf("%d\n", search("not"));
printf("%d\n", search("in"));
printf("%d\n", search("the"));
printf("%d\n", search("hash"));
printf("%d\n", search("table"));
return 0;
}
```
该实现使用了一个数组 `hash_table` 来表示哈希表,数组的每个元素是一个链表,用来解决哈希冲突。在插入元素时,使用 `hash` 函数计算元素的哈希值,然后将元素插入到对应的链表中。在查找元素时,同样使用 `hash` 函数计算元素的哈希值,然后遍历对应的链表查找元素。
请注意,该实现并没有处理哈希冲突的情况,即如果两个元素的哈希值相同,它们会被插入到同一个链表中,可能会导致链表过长,影响查