Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的常量表达式-如何散列字符串?_C_Hash_Constexpr - Fatal编程技术网

C中的常量表达式-如何散列字符串?

C中的常量表达式-如何散列字符串?,c,hash,constexpr,C,Hash,Constexpr,我正在创建一个内核模块。在本模块中,我需要根据一些预定义字符串检查输入。 在C++中,可以创建一个在编译时计算哈希函数的CONTHEXPR函数。我正在寻找一种在C中实现这一点的方法 一些伪代码使用: u32散列(常量字符*键) { u32散列,i; 尺寸透镜; len=strlen(键); for(散列=i=0;i6); } hash+=(hash>11); hash++=(hash我不认为你可以,C没有constexpr或编译时计算。这就是为什么很多人转向预处理器(在C++中使用较少),但使用

我正在创建一个内核模块。在本模块中,我需要根据一些预定义字符串检查输入。 在C++中,可以创建一个在编译时计算哈希函数的CONTHEXPR函数。我正在寻找一种在C中实现这一点的方法

一些伪代码使用:

u32散列(常量字符*键)
{
u32散列,i;
尺寸透镜;
len=strlen(键);
for(散列=i=0;i6);
}
hash+=(hash>11);

hash++=(hash我不认为你可以,C没有
constexpr
或编译时计算。这就是为什么很多人转向预处理器(在C++中使用较少),但使用它进行字符串处理(相对于字符串“构造”)并不容易

有时,可以通过添加另一个预处理步骤来解决这个问题,也许可以使用某种更高级的语言(我喜欢Python)来构建所需的C代码

如果这不是一个选项,那么我只需在启动时初始化哈希表一次。如果没有显式的init函数(我相信Linux内核模块有),当然可以使用静态标志:

static const char *strings[] = { "hello", "this is a text", "good morning", NULL };
static uint32_t myStringList[(sizeof strings / sizeof *strings) - 1];

void something(const char *string)
{
  static bool hash_initialized = false;
  if(!hash_initialized)
  {
    for(size_t i = 0; strings[i] != NULL; ++i)
      myStringList[i] = hash(strings[i]);
    hash_initialized = true;
  }
  if(hash_lookup(string))
  {
   ...
  }
}
static const char *strings[] = { "hello", "this is a text", "good morning", NULL };
static uint32_t myStringList[(sizeof strings / sizeof *strings) - 1];

void something(const char *string)
{
  static bool hash_initialized = false;
  if(!hash_initialized)
  {
    for(size_t i = 0; strings[i] != NULL; ++i)
      myStringList[i] = hash(strings[i]);
    hash_initialized = true;
  }
  if(hash_lookup(string))
  {
   ...
  }
}