2016-04-05 5 views
0

データベースを$ string、md5($ string)CSVファイルのセット(基本的にハッシュルックアップテーブル)で設定する必要があります。ハッシュルックアップテーブルのプライマリキー

私の質問は 私はプライマリキーとして文字列を使うべきですか?ハッシュ?余分なID列を追加しますか?

私はデータベースに何を求めているのだろうが、ハッシュが衝突する可能性があるので、ハッシュは良いと思う。ストリングは(空間を節約するために)ユニークでなければならない。

少なくとも35GBのデータが入力されていることを考慮して、パフォーマンスを念頭に置いてください。だから、実際に提案されたご意見は

答えて

0

私はシリアルIDフィールドを使用してしまったので、私が持っていたエントリの数をカウントすることができました。

最初の問題は、PRIMARY KEYを使用して列をインデックス化するだけで結構だと思って始めました。

これで問題は解決しました。インデックスを作成したところ、パフォーマンスは素晴らしいです!

+0

'serial'カラムを使用しないで、あなたが持っている行の数を数えることはできません。数字は**で**ギャプスではないことが保証されています。行を削除すると**これらのIDは再利用されません**。 –

+0

うわー!頭がおかげでありがとう、それを認識していない。しかし、この特定のケースでは、私はエントリを削除しないと思う。 – John

0

文字列が外部キー参照に使用される場合は、必ずしもハッシュを推奨しません。

  • 主キーとしてシリアル(自動インクリメント)ID列を作成します。
  • nameにユニークなインデックスを作成します。

これは、テーブル内のルックアップを容易にし、nameが一意であることを確認する必要があります。可変長文字列よりも外部キー参照には固定長の数値を使用する方が良いです。

ハッシュ値を使用していて実際に重複したくない場合は、同じハッシュ値を持つ異なる文字列を区別するためのメカニズムが必要です。自然な選択は、ある種のインクリメンタルカウンタですが、それはカウンタだけでハッシュを使わないで、ソリューションにかなり近づくでしょう。私はそれ自体、テーブルにそのようなハッシュ値を格納する利点を見ていません。

+0

私はパスワードの監査と統計を行っています。弱いパスワードであることを知るためにハッシュを解読していることがわかりました。簡単なパスワードの意味ですべての組み合わせを事前計算していました。 (長さ、文字セットなど)私のクエリはSELECT文字列FROMテーブルWHERE hash = 'hash'となります – John

+0

@John。 。 。しかし、弱いパスワードは強力なものと同じハッシュにすることができます。また、あまりにも多くのルールがあると思います。たとえば、文字を「n」回繰り返したり、他の人の名前を使用するなどです。 –

+0

MD5でも、ハッシュの衝突はほとんどありません。また、私はその "n"のことを考えました。私の質問はパフォーマンスに関するものでした。 – John

関連する問題