web-dev-qa-db-ja.com

HashBytes関数で適切なアルゴリズムを選択する

比較のために、nvarcharデータのハッシュ値を作成する必要があります。 T-SQLでは複数のハッシュアルゴリズムを使用できますが、このシナリオでは、どれを選択するのが最適ですか。

2つの異なるnvarchar値のハッシュ値が重複するリスクを最小限に抑える必要があります。インターネットでの私の研究に基づくと、MD5は最高のようです。そうですか? MSDNは利用可能なアルゴリズムについて教えてくれますが(下のリンク)、どのような条件でどのアルゴリズムを使用するかについての説明はありませんか?

HASHBYTES(Transact-SQL)

2つのnvarchar(max)列で2つのテーブルを結合する必要があります。ご想像のとおり、クエリの実行には時間がかかります。各nvarchar(max)データのハッシュ値を保持し、ブロブであるnvarchar(max)値ではなく、ハッシュ値で結合を行う方が良いと考えました。問題は、どのハッシュアルゴリズムが一意性を提供するかであり、それにより、複数のnvarchar(max)に対して1つのハッシュ値が存在するリスクに遭遇しません。

22
Sky

HASHBYTES 関数は、入力として最大8000バイトしかかかりません。入力がそれよりも大きくなる可能性があるため、選択したアルゴリズムに関係なく、ハッシュされるフィールドの範囲で重複が発生すると衝突が発生します。ハッシュする予定のデータの範囲を慎重に検討してください-最初の4000文字を使用するのは明白な選択ですが、最適ではない可能性がありますデータの選択。

いずれにせよ、ハッシュ関数とは何かのため、入力が8000バイト以下であっても、結果の100%の正確さを保証するonly方法は、ベースを比較することですある時点での値(読み取り:必ずしもfirstとは限りません)。限目。

100%の精度が必要かどうかは、ビジネスによって決まります。これは、(a)ベース値の比較が必要であるか、または(b)必要があるかconsidernotベース値の比較-パフォーマンスとトレードオフする必要のある精度。

ハッシュの衝突は一意の入力セットで発生する可能性がありますが、選択したアルゴリズムに関係なく、非常にまれです。このシナリオでハッシュ値を使用することの全体的なアイデアは、結合結果をより管理しやすいセットに効率的に絞り込むことであり、必ずしも最終的な結果セットにすぐに到達することではありません。繰り返しになりますが、100%の精度では、これはプロセスの最後のステップではありませんこのシナリオでは、暗号化の目的でハッシュを使用していないため、MD5などのアルゴリズムは正常に機能します。

「正確さ」の目的でSHA-xアルゴリズムに移行することを正当化することは、私にとって非常に困難です。なぜなら、ビジネスがMD5のごくわずかな衝突の可能性について気が狂うとしたら、彼らもその気が狂う可能性があるからです。 SHA-xアルゴリズムも完璧ではありません。彼らは、わずかな不正確さを受け入れなければならないか、クエリが100%正確であり、関連する技術的な意味をもって生きることを義務付けなければなりません。 MD5の代わりにSHA-xを使用していることを知っていれば、CEOが夜によく眠れると思います。この場合でも、技術的な観点からはあまり意味がありません。

パフォーマンスについて言えば、テーブルがほとんど読み込まれていて結合結果が頻繁に必要な場合は、インデックス付きビューを実装して、要求されるたびに結合全体を計算する必要をなくすことを検討してください。もちろん、その代わりにストレージをトレードオフしますが、特に100%の精度が必要な場合は、パフォーマンスを向上させる価値があります。

長い文字列値のインデックス作成の詳細については、I 公開された記事 を参照して、単一のテーブルに対してこれを行う方法の例を紹介し、この質問の完全なシナリオ。

19
Jon Seigel

MD5は問題なく、出力はバイナリに保存できます(16)。物理的なサンプルサイズが大きい場合でも、衝突の確率( 誕生日のパラドックス を参照)は非常に低いままです。 SHA-1の出力は20バイト、SHA-256の出力は32バイトです。誕生日の衝突確率が大きくなるほど多くのレコードがない場合(物理的に不可能であるか、現在のハードウェアテクノロジーでは少なくとも非現実的です)、おそらく問題はありません。

私はSHA-1を使用します。これは、使用可能なアルゴリズムの1つであり、すべてのアルゴリズムの中で衝突の可能性が最小です(2 ^ 20.96であるMD5と比較して2 ^ 51)。 MD5は、特定のシナリオでの衝突に対して脆弱であることが証明されています。

出典:

http://en.wikipedia.org/wiki/SHA-1http://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions#Cryptanalysishttp: //en.wikipedia.org/wiki/MD5

4
Mr.Brownstone

私はこれが回答に記載されているのを見たことはありませんが、 [〜#〜] msdn [〜#〜]

SQL Server 2016(13.x)以降、SHA2_256およびSHA2_512以外のすべてのアルゴリズムは非推奨になりました。古いアルゴリズム(非推奨)は引き続き機能しますが、非推奨イベントが発生します。

私は 同様の質問 を尋ねました。MD5などの廃止された関数を使用するかどうかは、あなた次第です(2016以降を使用している場合)。 MD5とSHA2の間でストレージとパフォーマンスにどの程度の違いがあるかをテストすることができます。

0
Gabe