2013-07-02 19 views
6

boost::hashを使用して、文字列のハッシュ値を取得しています。 しかし、Windows 32ビット版とDebian 64ビット版では、同じ文字列に対して異なるハッシュ値を与えています。boost :: hashから32ビットのハッシュ値を取得する

プラットフォームに関係なくboost::hashを使用して同じハッシュ値(32ビットまたは64ビット)を取得するにはどうすればよいですか?

+0

仮に、同じハッシュとブーストがアルゴリズムを少し変更しますか? –

+0

@マークBは、移植性の問題を引き起こす可能性があります。最も単純なケースでは、さまざまなプラットフォームからのハッシュ文字列を1つのデータ構造に集めて、バケット配信をランダム化することができます。 –

+1

ユニコードを使用しているインスタンスの1つで、 – Bee

答えて

4

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をサポートしていない可能性があります)いくつかのエキゾチックなメインフレームの約 移植を心配する必要はありませんよう、トリックを行う必要があります。

0

代わりにSHAなどのよく知られているユニバーサルハッシュ関数を使用します。これは、同じ文字列がどこでも同じハッシュになることを保証するためです。セキュリティ関連の何かをしている場合、SHAが速すぎるかもしれないことに注意してください。奇妙なことですが、時には速いことは、ブルートフォース攻撃の可能性を開くため、良い意味ではありません。この場合、他のより遅いハッシュ関数があります。そのうちのいくつかは基本的にSHAを何度も繰り返し適用します。あなたがパスワードをハッシュしている場合、別のことは、それらを塩分けすることを忘れないでください(私は詳細には触れませんが、情報はすぐにオンラインでアクセス可能です)。

+2

彼は 'boost :: hash'について尋ねたので、私は彼が暗号のセキュリティについて心配していたのではないかと疑います。データアクセスのハッシングでは、SHAははるかに遅く、生成するハッシュには十分なビットがあり、モジュロを実行するために大きな数のパッケージが必要になります。 –

+0

合意しました、ありがとうございます。 – user2520968

0

上記のハッシュ関数は単純ですが、弱く弱いです。

たとえば、 "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); 
}