哈希模板元函数和函数 < >编译时,任何计算都可以用C++模板元函数。因此,我正在考虑,如果可能的话: void my_function(char const* string_ptr) { switch (hash_function(string_ptr)) { case hash_metafunction<"yoohooo">::value: ... break; case hash_metafunction<"woooooo">::value: ... break; ... } } void my_函数(char const*string_ptr) { 开关(散列函数(字符串ptr)) { 大小写哈希_元函数::值: ... 打破 大小写哈希_元函数::值: ... 打破 ... } }

哈希模板元函数和函数 < >编译时,任何计算都可以用C++模板元函数。因此,我正在考虑,如果可能的话: void my_function(char const* string_ptr) { switch (hash_function(string_ptr)) { case hash_metafunction<"yoohooo">::value: ... break; case hash_metafunction<"woooooo">::value: ... break; ... } } void my_函数(char const*string_ptr) { 开关(散列函数(字符串ptr)) { 大小写哈希_元函数::值: ... 打破 大小写哈希_元函数::值: ... 打破 ... } },c++,c++11,C++,C++11,您能否给出在哪里可以找到哈希函数和模板元函数的代码(库)的线索。如果不存在这样的库,您能给我一些提示,告诉我如何自己滚动模板元函数吗?我特别担心模板元函数的char const*参数。也许可以使用一些预处理器魔法?一个constepr函数怎么样?当然,实现这个散列可能会很痛苦。您将有如下内容: // maybe another return type constexpr uint64_t hash_metafunction(const char* input) { // replace

您能否给出在哪里可以找到哈希函数和模板元函数的代码(库)的线索。如果不存在这样的库,您能给我一些提示,告诉我如何自己滚动模板元函数吗?我特别担心模板元函数的
char const*
参数。也许可以使用一些预处理器魔法?

一个
constepr
函数怎么样?当然,实现这个散列可能会很痛苦。您将有如下内容:

// maybe another return type
constexpr uint64_t hash_metafunction(const char* input) {
    // replace some_value with the hash implementation
    return some_value;
}

void my_function(char const* string_ptr)
{
  switch (hash_function(string_ptr))
  {
    case hash_metafunction("yoohooo"):
      ...
      break;

    case hash_metafunction("woooooo"):
      ...
      break;

    ...
  }
}
hash\u元函数
函数将在编译时执行

编辑:这是一个简单的实现,它基本上将输入字符串转换为
uint64\t

constexpr uint64_t do_the_hash(const char* input, uint64_t value_so_far) {
    return *input ? do_the_hash(input + 1, (value_so_far << 8) | *input) : value_so_far;
}

constexpr uint64_t hash_metafunction(const char* input) {
    return do_the_hash(input, 0);
}
constexpr uint64\u t执行\u散列(const char*input,uint64\u t value \u至今){

return*input?执行散列(input+1,(value)到目前为止我已经创建了
constexpr
版本的
杂音散列3


字符串文字不能是模板参数。但是,用户定义的文字可能是您需要的:
“yoohooo”_散列
。这就是为什么我要求使用预处理器魔法,也就是说,使用可变模板'y','o','o','h',可能是可能的。实际上,你不能对字符串文本使用templaty UDL…但是如果你写
foo
,当然可以。是的,是的,我想知道是否有可能转换“yoohoo”将预处理器宏字符串转换为“y”、“o”、“o”…好了,编辑我的答案。一切都是递归完成的。令人惊讶的是,太糟糕了,没有一个具有类似功能的库。问题是,使用constexpr实现像SHA1这样的东西会非常痛苦,因为到处都需要递归。只需执行一次,然后每个人都可以从中受益。我已经实现了一个MD5 constexpr哈希。有关链接,请参阅我的答案。
#include <iostream>
#include "md5.h"

int main() {
    constexpr auto value = ConstexprHashes::md5("constexpr rulz");

    std::cout << std::hex;
    for(auto v : value) {
        if(((size_t)v & 0xff) < 0x10)
            std::cout << '0';
        std::cout << ((size_t)v & 0xff);
    }
    std::cout << std::endl;
}
int main() {
  constexpr uint32_t hash = Murmur3_32("some_string_to_hash", 0xAED123FD);
  assert(hash == 4291478129);
}