3

使用 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;

    ...
  }
}

您能否提供有关在哪里可以找到散列函数和模板元函数的代码(库)的线索。如果不存在这样的库,您能否提示我如何自己滚动模板元函数?我特别担心char const*模板元函数的参数。也许一些预处理器魔法是可能的?

4

2 回答 2

7

constexpr函数呢?当然,实现该哈希可能会很痛苦。你会有这样的东西:

// 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_metafunction函数将在编译时执行。

编辑:这是一个天真的实现,它基本上将输入字符串转换为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);
}

现场演示在这里

编辑:我已经实现了编译时MD5 ,你可以在这里找到源代码。为了使用它,请执行以下操作:

#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;
}

这将打印出哈希:“b8b4e2be16d2b11a5902b80f9c0fe6d6”。

于 2012-08-30T14:43:40.510 回答
1

在 GitHub 上创建了一个as a gistconstexpr版本。MurmurHash3

int main() {
  constexpr uint32_t hash = Murmur3_32("some_string_to_hash", 0xAED123FD);
  assert(hash == 4291478129);
}
于 2013-07-17T16:52:28.040 回答