boost::hash
文字列のハッシュ値を取得するために使用しています。しかし、Windows 32 ビット システムと Debian 64 ビット システムでは、同じ文字列に対して異なるハッシュ値を与えています。
boost::hash
では、プラットフォームに関係なく、同じハッシュ値 (32 ビットまたは 64 ビット) を取得するにはどうすればよいでしょうか?
保証内容はboost::hash
?生成されたハッシュコードがそれを生成するプロセスの外で使用できるという保証はありません。(これはハッシュ関数の場合によくあります。) 異なるプログラムや異なるプラットフォームで有効な外部データのハッシュ値が必要な場合 (たとえば、ディスク上のデータへのハッシュ アクセス用)、独自のものを作成する必要があります。何かのようなもの:
uint32_t
hash( std::string const& key )
{
uint32_t results = 12345;
for ( auto current = key.begin(); current != key.end(); ++ current ) {
results = 127 * results + static_cast<unsigned char>( *current );
}
return results;
}
一部のエキゾチックなメインフレーム (
uint32_t
.
上記のハッシュ関数は単純ですが、脆弱で脆弱です。
たとえば、「bb」「bbbb」「bbddbb」「ddffbb」のような関数文字列に渡します。ペア記号とASCIIコードの任意の組み合わせで、下位バイトに注意してください。常に 57 になります。
むしろ、比較的軽量で、簡単な脆弱性がないハッシュ関数を使用することをお勧めします。
#define NLF(h, c) (rand[(uint8_t)(c ^ h)])
uint32_t rand[0x100] = { 256 random non-equal values };
uint32_t oleg_h(const char *key) {
uint32_t h = 0x1F351F35;
char c;
while(c = *key++)
h = ((h >> 11) | (h << (32 - 11))) + NLF(h, c);
h ^= h >> 16;
return h ^ (h >> 8);
}