我想以類似於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