【发布时间】:2020-07-09 01:46:21
【问题描述】:
我有一个结构,它包含一个 char* 和一个始终为 1 或 0 的 char。这是我的结构定义:
typedef struct Literal {
char *name;
char is_negated;
} Literal;
对于字符串哈希,我使用来自http://www.cse.yorku.ca/~oz/hash.html 的 djb2:
size_t str_hash(void *string) {
unsigned char *str = string;
size_t hash = 5381;
int c;
while ((c = *str++)) {
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
}
return hash;
}
我需要为我的结构创建一个哈希,它将字符串哈希中的信息与is_negated 结合起来。
【问题讨论】:
-
I have a struct- 但是你的函数需要void *string?为什么void*??a boolean (char)char不是_Bool。但是代码说 1000 字 - 发布结构定义,而不是解释它包含的内容。struct { char *string; _Bool c; }更清楚结构是什么。will combine the information你想如何“组合”这些信息?这是什么意思? -
为什么不简单地将布尔值视为字符串中的另一个字符。如果
b是您的布尔值(取值为 0 或 1),而hash是您的字符串哈希,您可以计算(hash * 33) + b。 -
我现在已经在问题中包含了结构定义。哈希函数采用
void *string的原因是因为我将它传递给我编写的哈希表,该哈希表需要为void*采用哈希函数,因为哈希表可以包含任何类型。(hash * 33) + b会使结果偏向 33 的倍数。我在哈希表中使用%对哈希函数进行规范化,因此这会使结果产生偏差。