gpt4 book ai didi

c - SuperFastHash 为相同的字符串返回不同的哈希值,但前提是由不同的函数调用确定

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:24 24 4
gpt4 key购买 nike

所以,我的 SFH 函数:

/*  
* Hash function (found at: 'http://www.azillionmonkeys.com/qed/hash.html')
*/
int32_t SuperFastHash(const char * data, int len) {
uint32_t hash = len, tmp;
int rem;

if (len <= 0 || data == NULL) return 0;

rem = len & 3;
len >>= 2;

/* Main loop */
for (;len > 0; len--) {
hash += get16bits (data);
tmp = (get16bits (data+2) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2*sizeof (uint16_t);
hash += hash >> 11;
}

/* Handle end cases */
switch (rem) {
case 3: hash += get16bits (data);
hash ^= hash << 16;
hash ^= ((signed char)data[sizeof (uint16_t)]) << 18;
hash += hash >> 11;
break;
case 2: hash += get16bits (data);
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1: hash += (signed char)*data;
hash ^= hash << 10;
hash += hash >> 1;
}

/* Force "avalanching" of final 127 bits */
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;

// Limits hashes to be within the hash table
return hash % HT_LENGTH;
}

看起来它工作正常,(而且它应该是因为除了最后一行之外的所有内容都没有被我触及)。

这是我将字典加载到哈希表中的函数,它似乎也能正常工作。

bool load(const char* dictionary)
{
// declares file pointer
FILE* dictptr = fopen(dictionary, "r");

// declare temp index
uint32_t index = 0;

// read words, one by one
while(true)
{

// malloc node
node* new_node = malloc(node_size);

// insert word into node, if fscanf couldn't scan word; we're done
if (fscanf(dictptr, "%s", new_node->word) != 1)
{
return true;
}

// hash word - HASH FUNCTION CALL -
index = SuperFastHash(&new_node->word[0], sizeof(new_node->word));

// check if head node has been assigned with value
if (!strcmp(hashtable[index].word,""))
{
// declare hashtable[index] to new_node
hashtable[index] = *new_node;

//increment size
hashtablesize++;
}

else
{
// if node is initialized, insert after head
new_node->next = hashtable[index].next;
hashtable[index].next = new_node;

//increment size
hashtablesize++;
}
}
}

最后,我的检查函数根据哈希表检查单词。

bool check(const char* keyword)
{

// gets index from SFH
uint32_t index = SuperFastHash(keyword, sizeof(keyword));

// declares head pointer to the pointer of the index'd element of hashtable
node* head = &hashtable[index];

// if word of head is equal to keyword, return true
// else continue down chain till head is null or key is found
while (head != NULL)
{
if (!strcmp(head->word, keyword))
{
return true;
}
head = head->next;
}
return false;
}

注意:当使用不同的散列函数时,一切正常,所以我怀疑问题出在 len 参数或实际的 SFH 函数中。

我已经用 lldb 检查返回的索引,比方说,“cat”不等于“cat”驻留在哈希表中的索引。即,加载中函数调用返回的索引。

最佳答案

一些事情......

  1. 正如一位评论者所提到的,使用 sizeof() 不会为您提供正确的字符串长度。例如,改变

    index = SuperFastHash(&new_node->word[0], sizeof(new_node->word));

    index = SuperFastHash(&new_node->word[0], strlen(new_node->word));
  2. 您在阅读字典文件后未能调用 fclose()。如果 fopen() 成功,您应该调用 fclose()

  3. 下面的代码看起来有点可疑:

    // check if head node has been assigned with value
    if (!strcmp(hashtable[index].word,""))
    {
    // declare hashtable[index] to new_node
    hashtable[index] = *new_node;

    //increment size
    hashtablesize++;
    }

如果哈希表在一开始就完全初始化,是否需要增加hashtablesize?如果哈希表未完全初始化,则在尚未初始化的条目上调用 strcmp() 是潜在的麻烦。您没有显示声明或初始化代码,因此不能 100% 清楚这是否真的是一个问题,但可能需要仔细检查。

关于c - SuperFastHash 为相同的字符串返回不同的哈希值,但前提是由不同的函数调用确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31381649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com