c_cpp 在C中的哈希表,它可以解决重复问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 在C中的哈希表,它可以解决重复问题。相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABLE_SIZE 5000
#define TABLE_ALLOC(size) malloc(sizeof(TableNode) * size)


typedef struct
{
	unsigned long hashKey;
	void* value;
} TableNode;

static TableNode H_TABLE[TABLE_SIZE];


unsigned long
hashFn(void *object, unsigned n)
{
    unsigned char* str = object;
    unsigned long hash = 5381;
    int c;

    while (n--)
    {
        c = *str++;
        hash = ((hash << 5) + hash) + c; 
    }

    return hash;
}

void clean(void)
{
	for(int i = 0; i< TABLE_SIZE; i++)
	{
		H_TABLE[i].hashKey = 0;
		H_TABLE[i].value = NULL;
	}
}

void insert(void* key, unsigned keyLen, void* value)
{
	unsigned long hashed = hashFn(key, keyLen);
	while(H_TABLE[hashed % TABLE_SIZE].hashKey != 0)
	{
		// Double Hashing.
		hashed = hashFn(&hashed, sizeof(unsigned long));
	}
	H_TABLE[hashed % TABLE_SIZE].hashKey = hashed;
	H_TABLE[hashed % TABLE_SIZE].value = value;
}

int main(int argc, char const *argv[])
{
	char* mes = "Hello!";
	unsigned long foo = hashFn(mes, 6);
	printf("The hash is %lu\n", foo);
	for (int i = 0; i < 50; ++i)
	{
		printf("The hash is %lu\n", (foo = hashFn(&foo, sizeof(foo))) % 5000);
	}
	return 0;
}

以上是关于c_cpp 在C中的哈希表,它可以解决重复问题。的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp c中的快速哈希表实现。

c_cpp c的哈希表

c_cpp 哈希表实现

c_cpp 为字符串实现哈希表和哈希函数

c_cpp 为字符串实现哈希表和哈希函数

c_cpp c中非常简单的哈希表