我想以类似于Symbol
的方式实现ruby。编译字符类型的时间一致性散列
为此,我创建了一个用户定义的文字,返回std::basic_string<T>
对应的std::hash
。
代码非常好,但是当我读somewhere时,哈希函数在同一程序的多次执行中可能不一致。此外,我想在编译时进行这种计算,这是1)std::hash
不支持,2)如果std::hash
返回值发生更改,将会破坏代码。
所以我写下了基于java.lang.String.hashCode实现的以下实现。
typedef size_t symbol;
template<typename CharT>
constexpr size_t constant_hash(const CharT* p, size_t h = 0) noexcept
{
return (*p == 0) ? h : constant_hash(p + 1, h * 31 + static_cast<size_t>(*p));
}
constexpr symbol operator "" _sym (const char* p, size_t n) noexcept
{
return constant_hash(p);
}
我的问题是:是否有任何问题与此实现?
我只能在GCC 4.7.1上测试它,并且我想知道它是否符合标准,并且 也应该在其他编译器上工作。
我在问这是因为以前的实现在GCC上工作,但如果二进制编译为clang ++(我认为增量运算符的未定义行为的问题),导致段错误。
在此先感谢
编辑
铿锵工作++(感谢KennyTM)
我试过clang ++,但它不会崩溃。 – kennytm
谢谢:)我编辑帖子 – Geoffroy