Symbol
ルビーと同じように実装したいです。
std::hash
このために、対応するのを返すユーザー定義リテラルを作成しましたstd::basic_string<T>
。
コードは素晴らしかったですが、どこかで読んだように、同じプログラムの複数の実行でハッシュ関数が一貫していない可能性があります。さらに、コンパイル時にこの計算を行いたいと思っていました。これは、1)でサポートされておらず、2)戻り値が変更されたstd::hash
場合にコードが破損するというものでした。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 ++でコンパイルされた場合にセグメンテーション違反が発生したためです(インクリメント演算子による未定義動作の問題だと思います)。
前もって感謝します
編集
clang ++での作業(KennyTMに感謝)