2016-05-20 2 views
0

チェックサムをプライマリキーとして使用すると、いくつの行を持つことができますか?チェックサムをプライマリキーとして使用すると、いくつの行を持つことができますか?

+2

は、恐ろしい考えです。さらに、衝突を制御することができないため、格納する予定の行の数とは完全に独立して、どの行が一緒に行かないかを知ることさえできません。チェックサム値にインデックスを作成できますが、それらを一意にしないでください。 –

+0

@Jeroen Mostertは絶対に正しいです。あなたのテーブルの行の例はいくつか教えていただけますか? –

答えて

1

CHECKSUMは、intを返します。したがって、teatertically 2^32 = 4294967296の固有の値を持つことができます。 しかし、実際の生活では、チェックサムは異なる引数について同じ結果を返すことができるので、その数値に達することはありません。 このため、チェックサム結果をPKとして使用しないでください。

1

チェックサムは一意ではないため、主キーとして使用しないでください。通常の自動インクリメントPK、チェックサムカラムを作成し、必要に応じてインデックスを追加します。

ここに、ハッシュが衝突する理由があります。衝突は、2つの異なる入力が同じハッシュになる場合です。 それは起こりそうにないが、チャンスはある。たとえば、テキスト "plumless"を持つファイルのCRC32は、テキスト "buckeroo"とまったく同じです。 "コーディング" vs "gnu"と同じです。

約250.000行を取得すると、衝突する可能性があるため、PKが重複する可能性がかなり高くなります。チェックサムがユニークな、定義*で*、ではないので

ソース主キーとしてチェックサムを使用して

+1

"起こりそうにありません" - どのような種類のデータを「CHECKSUM」に供給しているかによって異なります。あなたがちょうど2つの「INT」を送り込んでいて、それらが低い値になる可能性が高い場合、衝突はかなり可能性があります。私のマシンでは、 'select CHECKSUM(4,0)、CHECKSUM(0,64)'は両方の式に対して64を生成します。 –

+1

'CHECKSUM'は実際には共通のインスタンスで衝突を起こす可能性のあるひどいアルゴリズムを実際に使用します。ダミアンの例は多くのうちの1つに過ぎません。適切に検査されたチェックサム( 'HASHBYTES( 'sha1'、...) 'のような)を使用することで、根本的な問題は解決されませんが、問題は改善されます。 –

+0

ありがとう、私は答えを編集しました! –

関連する問題