我问了C知道,它告诉我哈希是
int Hash(const char * str)
{
int sum = 0;
for(int i = 0;i<strlen(str);i++)
sum^= str[i];
return sum;
}
利用每个字符所对应的ASCII码,将一个字符串的字符不停的进行异或(^)操作。
需要注意,给出的这个简单的算法并不能保证一一对应。在多(多个节点)对一(一个哈希值)时,把这几个节点像之前构造链表一样,再串起来即可【可以很好的减少查找的复杂性】。
在计算之后,还需要让这些哈希值可以表示链表的节点。因此这时候再构造一个指向Node(具体参看上一篇链表)的指针数组,每个数组元素都是一个指针,数组下标对应的指针,指的就是,通过上面哈希函数算出来的,等于数组下标的,Node节点。
void Insert(Node *hash_tab[],Node elem)
{
int idx = Hash(elem.id); //index(索引)得到元素的哈希值
Node * data = new Node; //我们所需要的时数据内容,而非原来数据的地址。
*data = elem; //data所指的空的空间给它填上elem的内容
data->next = hash_tab[idx]; //常规三步走,把hash_tab指向的让data指
hash_tab[idx] = data; //再让hash_tab指向data
}
【向哈希表里插入元素的函数👆】
void Output(Node *hash_tab)
{
for(int i = 0;i<256;i++) //之前设置了数组长度是256
{
if(hash_tab[i] = NULL)
continue;
cout<<i<<":"; //表示哈希值是i的链表节点
Print(hash_tab[i];
}
}
【按照哈希链表的下标顺序输出节点内容】
void Delete(Node *list)
{
while(list) //当这个list指针不为空,即不是NULL时
{
Node * tmp = list; //用一个新指针指向list指的
list = list->next; //然后让这个list指针往下指
delete tmp; //最后删除临时指针指的,也就是节点的数据
}
}
【释放空间,最终得到一个list指向NULL】
void Release(Node *hash_tab)
{
for(int i = 0;i<256;i++)
{
if(hash_tab[i] == NULL)
continue;
Delete(hash_tab[i]);
hash_tab[i] = NULL;
}
}