2009-04-16 6 views
6

1)本当に低いハッシュコリジョンの目的のために、sha1自体を扱うのではなく、sha1の128ビットの半分を使用するだけで取り除くことができますか?私はこれが暗号ハッシュには適していないと理解していますが、ハッシュテーブルキーのハッシュだけが必要です。sha1ハッシュの64ビットのみをIDとして使用することはできますか?

2)計算時間は優先順位ではなく、それ以外にも非常に小さなデータがハッシュされています。特に、私は主に2〜3つの64ビットハッシュを取得し、別の64ビットハッシュを取得するためにそれらをハッシュします。この目的のためにsha1より良い選択肢がありますか?再び、衝突は非常に起こりにくいはずです。

3)私はsql newbです。 sqlのIDとして64ビットハッシュを使用するのは良い考えですか? 64ビットのIDはsqliteやpostgresのパフォーマンス上の問題を引き起こしますか?私は複数のデータベース(Luceneインデックスを含む)にまたがってデータを調整する必要があるので、自動インクリメントIDで悩むのではなく、テーブルで直接ハッシュを処理する必要があると考えました(これは1つのデータベースでのみ意味があります。すべてのデータストアにわたって)。私は64ビットが良い妥協策であると考えています。衝突はほとんど起こりませんが、スペース(および参照時間)を節約します。

4)CRC-64はどうですか?それは十分にランダムな分布を生み出しますか?

答えて

6

十分なレコードがない場合は、64ビットでハッシュコリジョンが発生しないことがほぼ確実です。おそらくあなたはこのカテゴリに入るでしょう。内部構造はハッシュであった場合、暗号ハッシュであることが十分ではありませんので、

あり、SHA1などの暗号化ハッシュをダウントリミングして問題はないはず、と何の構造は、いずれかが、その後がない場合ビットのサブセットは全くランダムでなければならない。私はIDのためにそれを使用することを話しているだけで、暗号化の目的ではありません!

実際には、SQLにはGUIDのようなものはありませんか?そしてもしそうなら、それを使わないのはなぜですか?

+0

私はGUID/UUIDが私の望むものだと思います。しかし、sqliteサポートが適切かどうかは分かりませんので、私はそれを調べます。私が言ったように、私はsql newbです。 – Jegschemesch

+0

Sqlite3はUUIDをサポートするように簡単に拡張することができます。以前はiPhoneアプリで成功しました。 –

+0

私はこの回答に同意します。私は数百万行のhundretsでいっぱいのテーブルを持っており、パフォーマンスの理由から文字列としてsha1ハッシュの代わりに最初の64ビットをunsgined整数キーとして使用しています。 3億5千万の行で私は56ビットでいくつかの衝突を抱えていました。私はいつも日付と64ビットハッシュキーを組み合わせて、ハッシュキーと日付の両方をマッチさせる必要があります。この方法を使用すると、衝突を引き起こす可能性のある1日あたり3,000万行しかないため、長期的に発生する機会が大幅に減ります。衝突が起こると情報の単一の平和が間違ったものになります - 私の場合、節約に値するものです。 – bhelm

0

計算時間が重要ではない場合、なぜ128ビット全体に行きませんか?ストレージの問題の可能性の他に64ビットを選択する本当の理由はありますか? (そして、余分な8バイトは、あなたがそれほど安価なストレージであなたを殺すつもりはありません)

64ビットと128ビットはSQLiteでスピードの問題を起こさないでしょう、私はMySQLについては確信していません。ハッシュの長さの良い比較のために

+0

ランダムハッシュデータをキーとして使用すると、キーが文字列ではなく機械固有の整数に収まる場合、ほとんどのデータベースシステムが検索と結合操作により効率的になると思います。 – bhelm

3

あなたのキーは絶対一意性を必要はありませんでしょう一意性の高い確率。私はデータベース間の互換性のためにあなたのキーのハッシュの代わりにGUIDを使用することをお勧めします。ハッシュをクイックルックアップメカニズムとして生成します。これに固有のインデックスを持たせることはできませんが、コリジョンの場合は、実際のデータを比較して同じであることを確認する必要があります。データベースの同期化では、ハッシュをチェックして(すぐにインデックスを使用して)、衝突が見つかった場合は、データが同じかどうかを解決し、GUIDを解決する必要があります。コリジョンがない場合は、不足しているエントリが必要なデータベースを更新し、他のデータベースのGUIDを使用して挿入します。

私も、スペースを節約するためにハッシュの独自のハッシュを作成するには少し注意してください。すでに他のハッシュがある場合は、それらを使用してください(追加する、再ハッシュしないでください)。そうでない場合は、MD5やSHA1のような標準のハッシュ関数を使用して、結果のデータを格納してください。

+1

しかし、なぜ私は絶対的な一意性が必要ですか?私たちは非常に高い確率について話していませんか? 2^128の確率で1つのアイテムが同じハッシュを持つ可能性はありますか?私たちは流星に襲われることを心配しないでしょうか?または、MD5とsha1はランダムに十分に配布されませんか? – Jegschemesch

+0

ああ、私はGUID/UUIDのことを知らなかったので、私たちはお互いに話していると思います。でも、GUIDは絶対にユニークではありませんか? – Jegschemesch

+0

はい。世界的にユニークな(またはユニバーサルユニークな)IDは絶対にユニークです。生成アルゴリズムは、2つのマシンが同じIDを生成しないことを保証します。私の主張は、たとえそれがプライマリキーとして使用されていても、どれほど稀であっても、1つの衝突でさえ耐えられないということでした。 – tvanfosson

2

64ビットハッシュでは、6との衝突確率は1%です。1×10 レコード。 (他の組み合わせについては、Wikipediaのpage on the Birthday problemを参照してください。)1秒ごとに最初の64ビットまたは最後のビットを捨てることはできますが、ハッシュのプロパティには違いはありません。

関連する問題