web-dev-qa-db-ja.com

ハッシュコードとチェックサム-違いは何ですか?

私の理解では、ハッシュコードとチェックサムは似たようなものです。つまり、データのブロックに対して計算された数値、つまり相対的ユニークです。

つまり、データの2つのブロックが同じ数値のハッシュ/チェックサム値を生成する可能性は十分に低いため、アプリケーションの目的では無視できます。

それでは、同じことに対して2つの単語があるのでしょうか、それともハッシュコードとチェックサムの間に重要な違いがありますか?

104
Richard Everett

チェックサムは、必然的にa ハッシュコード と言います。ただし、すべてのハッシュコードが適切なチェックサムを作成するわけではありません。

チェックサムには特別な目的があります---データの整合性を検証またはchecksします(一部は error-correction を許可することでそれを超えることができます)。 「良好な」チェックサムは簡単に計算でき、多くの種類のデータ破損(1、2、3個のエラービットなど)を検出できます。

ハッシュコードは、データを特定の値にマッピングする 数学関数 を単に説明します。データ構造(ハッシュテーブルなど)でインデックスを作成する手段として使用する場合、衝突の可能性は低いことが望ましいです。

64
Zach Scrivena

それぞれの背後には異なる目的があります。

  • ハッシュコード-ドメイン全体でランダムになるように設計されています(ハッシュテーブルなどの衝突を最小限に抑えるため)。暗号化ハッシュコードは、逆に計算的に実行不可能になるようにも設計されています。
  • チェックサム-データ内の最も一般的なエラーを検出し、多くの場合、計算が高速になるように設計されています(データの高速ストリームを効果的にチェックサムするため)。

実際には、多くの場合、同じ機能が両方の目的に適しています。特に、計算コストに余裕がある場合、暗号的に強力なハッシュコードは良いチェックサムです(ランダムエラーが強力なハッシュ関数を壊すことはほとんど不可能です)。

40
Rafał Dowgird

確かにいくつかの違いがあります:

  • チェックサムは、入力が異なる場合(可能な限り頻繁に)異なる必要がありますが、計算が高速であることはほぼ同じくらい重要です。
  • ハッシュコード(ハッシュテーブルで使用)には同じ要件があり、さらに、特に類似する入力の場合、コードスペース全体に均等に分散する必要があります。
  • 暗号化ハッシュにはmuchより厳しい要件があり、ハッシュを指定すると、このハッシュを生成する入力を構築できません。計算時間が2番目になり、アプリケーションによっては(ブルートフォース攻撃に対抗するために)ハッシュの計算が非常に遅いことが望ましい場合もあります。
21

ウィキペディア それはうまく置きます:

チェックサム関数は、ハッシュ関数、フィンガープリント、ランダム化関数、および暗号化ハッシュ関数に関連しています。ただし、これらの概念にはそれぞれ異なる用途があるため、設計目標が異なります。チェックディジットとパリティビットは、小さなデータブロック(社会保障番号、銀行口座番号、コンピューターワード、シングルバイトなど)に適したチェックサムの特殊なケースです。一部のエラー修正コードは、一般的なエラーを検出するだけでなく、特定のケースで元のデータを回復できる特別なチェックサムに基づいています。

8
Jon Skeet

ハッシュコードとチェックサムは両方とも、データ項目から短い数値を作成するために使用されます。違いは、データ項目に小さな変更が加えられた場合でも、チェックサム値が変更されることです。ハッシュ値の要件は、実際のデータアイテムに個別のハッシュ値を持たせることだけです。

明確な例は文字列です。文字列のチェックサムには、すべてのビットが含まれている必要があり、順序が重要です。一方、ハッシュコードは多くの場合、長さが制限されたプレフィックスのチェックサムとして実装できます。つまり、「aaaaaaaaaaba」は「aaaaaaaaaaab」と同じハッシュになりますが、ハッシュアルゴリズムはそのような衝突を処理できます。

8
MSalters

チェックサムは、偶発的な変更から保護します。

暗号化ハッシュは、非常に意欲的な攻撃者から保護します。

ワイヤでビットを送信すると、一部のビットが反転、削除、または挿入されることがあります。このような事故を受信者が検出できるようにする(または場合によっては修正する)ために、送信者はチェックサムを使用します。

ただし、ネットワーク上のメッセージを積極的かつインテリジェントに変更する誰かがいると想定し、この種の攻撃者から保護したい場合は、暗号化ハッシュを使用します(ハッシュに暗号的に署名すること、またはセカンダリチャネルなどを使用することを無視しています)質問はこれに逃げていないようです)。

4
user3464863

最近は交換可能ですが、昔のチェックサムは非常に単純な手法で、すべてのデータを(通常はバイト単位で)加算し、その値でバイトを最後に追加します。元のデータのいずれかが破損していたかどうかを知る。チェックビットに似ていますが、バイトがあります。

3
Steven Robbins

ハッシュコードとチェックサム関数の違いは、異なる目的のために設計されていることです。

  • チェックサムを使用してifが入力内の何かが変更されたことを見つけます。

  • ハッシュコードを使用して、if入力の何かが変更されたandを見つけて、個々のハッシュコード値間の「距離」をできるだけ大きくします。

    また、mighthash-trees/clusters/bucketsを形成する機能のように、このルールとは反対に、ハッシュ関数のさらなる要件があるコード値を早期に。

    共有された初期ランダム化を追加すると、最新の暗号化/キー交換の概念が得られます。


確率について:

たとえば、入力データが実際に常に変化すると仮定します(100%の時間)。そして、1ビットのハッシュ/チェックサム値を生成する「完璧な」ハッシュ/チェックサム関数があると仮定しましょう。したがって、ランダムな入力データに対して、50%の確率で異なるハッシュ/チェックサム値を取得します。

  • ランダム入力データの正確に1ビットが変更された場合、入力データの大きさに関係なく、その100%の時間を検出できます。

  • ランダムな入力データの2ビットが変更された場合、「変更」を検出する確率は2で除算されます。これは、両方の変更が互いに中和し、ハッシュ/チェックサム関数が2ビットが入力データで実際に異なることを検出しないためです。

    ...

つまり、入力データのビット数がハッシュ/チェックサム値のビット数よりも数倍大きい場合、入力値ごとに異なるハッシュ/チェックサム値を実際に取得する確率が低下し、定数ではありません

2
Sascha Wedler

checkに使用できるファイルまたはデータ用に作成されたコード(数値またはそれ以外)を参照する場合、Wordチェックサムを使用する傾向があります。私が遭遇する最も一般的な使用法は、ネットワーク経由で送信されたファイルが変更されていないことを確認することです(故意またはその他)。

1
Ian1971

ハッシュとチェックサムはどちらもファイルの内容に基づいて値を作成するという点で似ていますが、ハッシュはチェックサムの作成と同じではありません。チェックサムは、データの整合性を検証(チェック)し、データ送信エラーを識別することを目的としていますが、ハッシュは、データの一意のデジタルフィンガープリントを作成するように設計されています。

出典:CompTIA®Security + Network Security Fundamentalsガイド-第5版-Mark Ciampa-191ページ

1
N Randhawa