C中的常量表达式-如何散列字符串?
我正在创建一个内核模块。在本模块中,我需要根据一些预定义字符串检查输入。 在C++中,可以创建一个在编译时计算哈希函数的CONTHEXPR函数。我正在寻找一种在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++中使用较少),但使用
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))
{
...
}
}