【问题标题】:C how to combine string hash function with boolean?C如何将字符串哈希函数与布尔值结合起来?
【发布时间】: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 的倍数。我在哈希表中使用 % 对哈希函数进行规范化,因此这会使结果产生偏差。

标签: c algorithm hash hashcode


【解决方案1】:

这是在不引入偏见的情况下做到这一点的方法:

return (str_hash(name) << 1) + is_negated;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2013-06-13
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多