编译时字符串哈希

niX*_*man 12 c++ hash boost metaprogramming

我需要使用一个字符串作为ID来获取一些对象.在运行时实现这一点,并且运行良好.但由于显而易见的原因,这使得静态类型检查变得不可能.

我用Google搜索了在编译时计算字符串的哈希和的算法:使用Boost.MPL进行C++编译时字符串哈希.

它似乎是我的问题的完美解决方案,除了算法所必需的sring应该被分成4个字符或逐个字符,显而易见的原因.

即,而不是通常的ID的当前记录,我将不得不这样写:

hash_cstring<boost::mpl::string<'obje', 'ct.m', 'etho', 'd'>>::value
Run Code Online (Sandbox Code Playgroud)

这绝对无法使用.

问题是,如何正确传递诸如"object.method"此算法的字符串?

谢谢你们.

niX*_*man 8

使用gcc-4.6解决方案:

#include <iostream>
template<size_t N, size_t I=0>
struct hash_calc {
    static constexpr size_t apply (const char (&s)[N]) {
       return  (hash_calc<N, I+1>::apply(s) ^ s[I]) * 16777619u;
    };
};

template<size_t N>
struct hash_calc<N,N> {
    static constexpr size_t apply (const char (&s)[N]) {
       return  2166136261u;
    };
};

template<size_t N>
constexpr size_t hash ( const char (&s)[N] ) {
    return hash_calc<N>::apply(s);
}

int main() {
   char a[] = "12345678";
   std::cout << std::hex << hash(a) << std::endl;
   std::cout << std::hex << hash("12345678") << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

http://liveworkspace.org/code/DPObf

我很高兴!


Mar*_*k B 5

我不知道使用预处理器或模板的方法.我怀疑你最好的办法就是创建一个单独的预编译步骤(比如使用perl等)来hash_cstring从一组源语句生成语句.然后,至少您不必在添加新字符串时手动拆分字符串,并且生成完全自动化且可重复.