暗号化でのハッシュ

暗号化におけるハッシュについて学びたいですか?もしそうなら、あなたは正しい場所に来ました.

この記事では、ハッシュについて詳しく説明します.

ハッシュは、オブジェクトまたは値のグループからオブジェクトまたは値を識別するためのコンピュータサイエンス技術です。.

紛らわしいですね?

例を挙げて理解してみましょう.

ええと、大学は彼らの学生のそれぞれに一意に割り当てられた番号を提供します。この一意の番号は、学生とその学生に関連する情報を識別するものです。一意の番号を生成するために使用される方法はハッシュです.

もう1つの人気のある例は、棚にたくさんの本がある図書館です。そこにある各本には固有の識別番号があり、巨大な図書館に置くことができます。!

ハッシュの最新の例は、ゲームに登録するゲームプレーヤーです。 Valorantは、Riotが立ち上げた無料ゲームです。無料でプレイできるということは、何百万人もの人々がゲームをプレイすることを意味します.

各プレーヤーは、ハッシュアルゴリズムを使用して生成された一意の識別値を使用して識別されます.

以下で詳しく理解してみましょう.

 

ハッシュとは?

上記のように、ハッシュはグループからオブジェクトを識別する方法です。.

各オブジェクトは、ハッシュされると一意の識別番号を取得します.

しかし、それは技術的にどういう意味ですか?

技術的には、数学関数は、任意の長さの任意の入力文字列から固定長の出力を生成します.

ビットコイントランザクションは、トランザクションが一意のIDを取得する場所でハッシュされます.

「Hello、World!」を入力するとで SHA-256ハッシュアルゴリズム, 次の出力が得られます。

入力: こんにちは世界!

出力: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

ここで、SHA256は指定された入力から出力を生成します。ご覧のとおり、Secure Hash Function(SHA-256)ハッシュアルゴリズムを使用しました。これは、Message Direct(MD5)やSecure Hash Function(SHA1)など、一般的なハッシュ方式の1つです。.

ハッシュ関数の主要なプロパティにより、信頼性が高まります。それらを以下にリストしましょう.

  • 決定論的 →これは、特定の状況で特定の入力に対して出力が同じになることを意味します.
  • 原像耐性 →プリイメージ耐性機能により、ハッシュ値が入力値の生成に役立たないことが保証されます.
  • 計算効率 →ハッシュ関数は効率的で、実行するのに膨大な計算リソースを必要としません.
  • リバースエンジニアリングはできません →ハッシュ関数をリバースエンジニアリングすることはできません.
  • 衝突耐性 →衝突耐性により、2つの入力が同じ出力になることはありません.

初心者向けの暗号化ハッシュについては、ここですでに説明しました。そこをチェックしてください:暗号化ハッシュ:初心者向けガイド. 

しかし、あなたが高度なもののためにここにいるなら、あなたは失望することはありません.

 

ハッシュ関数とハッシュテーブルとは何ですか?そしてそれらはどのように機能しますか?

このセクションでは、ハッシュ関数とハッシュテーブルについて詳しく説明します。ハッシュに関しては、ハッシュ関数があります。これらの関数は、大きな入力を小さな固定入力に変換する役割を果たします。ハッシュテーブルは出力を格納します.

ハッシュプロセスでは、オブジェクトはキーと値のペアに基づいて配列に分散されます。したがって、要素の配列をハッシュ関数に渡すと、各要素にキーが付加された配列出力が得られます。キーと値のペアは、印象的なO(1)時間を提供するため、要素にリアルタイムでアクセスする場合に非常に便利です。.

ハッシュ関数を実装するために、2つの好ましいアプローチを取り除くことができます.

  • 最初のアプローチは、ハッシュ関数を使用して要素を整数に変換することです。次に、整数出力を使用して、ハッシュテーブルに配置するときに要素にアクセスできます。.
  • 別のステップは、要素をハッシュテーブルに配置し、ハッシュキーを使用して取得することです。.

2番目の方法では、関数は次のようになります。

hash = hash_function(key) インデックス=ハッシュ%array_size

ここで、ハッシュと配列のサイズは互いに独立しています。インデックス値は、配列サイズに基づいて計算されます。モジュロ演算子(%)を使用すると、値を計算できます.

簡単に言うと、ハッシュ関数は、任意のサイズのデータ​​セットを固定サイズのデータ​​セットにマップできる関数として定義できます。結果の固定サイズのデータ​​セットは、ハッシュテーブルに格納できます。ハッシュ関数によって返される値には多くの名前が付けられています。それらは、ハッシュ値、ハッシュ、ハッシュ合計、およびハッシュコードと呼ばれます。.

 

良いハッシュ関数を書く

優れたハッシュ関数またはメカニズムを作成する場合は、それらを作成するための基本的な要件を理解する必要があります。それらを以下にリストしましょう:

  • ハッシュ関数は計算が簡単である必要があります。つまり、実行するのに多くのリソースを必要としないはずです。.
  • ハッシュ関数は均一に分散する必要があります。そうすることで、ハッシュテーブルを利用してハッシュ値を格納し、クラスタリングが発生しないようにします。.
  • 最後の要件は、衝突が少ないか、まったくないことです。衝突がないということは、単一の出力が2つの入力にマップされていないことを意味します.

技術的には、衝突はハッシュ関数の一部であり、ハッシュ関数から削除することはできません。目標は、優れたハッシュテーブルのパフォーマンスを提供し、衝突解決手法を通じて衝突を解決できるハッシュ関数を作成することです。.

 

なぜ優れたハッシュ関数が必要なのですか?

便利なハッシュ関数の必要性を理解するために、以下の例を見てみましょう。.

入力文字列が次のようになるハッシュ手法を使用してハッシュテーブルを作成するとします。{“agk”、 “kag”、 “gak”、 “akg”、 “kga”、 “gka”}

ここで、a(97)、g(103)、およびk(107)のASCII値を単純に加算し、合計を307でモジュロするハッシュ関数を作成します。.

明らかに、3つの数値の合計も307です。これは、すべての数値を並べ替えてからモジュロ演算を実行すると、同じ結果が得られることを意味します。最終的には、すべての文字列が同じインデックス番号に格納されます。ハッシュ関数のアルゴリズム時間もO(n)の複雑さであり、これは望ましくありません。説明したハッシュ関数は実際のシナリオには最適ではないと簡単に結論付けることができます。.

ハッシュ関数を修正するために、各要素のASCII値の合計を別の素数727で除算することを展開できます。そうすることで、指定された入力文字列配列に対して異なる出力を取得します。.

 

ハッシュテーブルについて学ぶ

ハッシュテーブルは、インデックスを計算してそれに対する値を格納するハッシュ関数の結果を格納するのに非常に役立ちます。最終結果は、O(1)の複雑さを伴うより高速な計算プロセスになります.

ハッシュテーブルは、O(n)時間を必要とする問題を解決するのに伝統的に良い選択です.

したがって、固定長の文字列を取得してから、文字列の文字の頻度を学習しようとすると、.

したがって、string =“ aacddce”の場合、一般的なアプローチは、文字列を複数回調べて、各頻度を保存することです。.

#入力文字列を入力し、その文字列内の文字の頻度を数えます

#アルゴリズムは0(n)の複雑さの時間です

temp_list = [] start = "A" str = "ababcddefff" def alpha_zeta():alpha = ‘a’ for i in range(0,26):temp_list.append(alpha)alpha = chr(ord(alpha)+ 1)return temp_list temp_list = alpha_zeta()#print( character_frequency(str、temp_list):temp_list内のそれぞれについて:freq = 0 for i in str:if(i == each):character(各頻度)(各freq)_ freq = freq + 1

上記のプログラムの出力は次のようになります。

a 2 b 2 c 1 d 2 e 1 f 3 g 0 h 0 i 0 .. ..

それでは、C ++でハッシュテーブルを実装し、文字の頻度を数えましょう.

#include using namespace std; int Frequency [26]; int hashFunc(char c){return(c-‘a ‘); } void countFre(string S){for(int i = 0; i< S.length(); ++ i){int index = hashFunc(S [i]);頻度[インデックス] ++; } for(int i = 0; i<26; ++ i){cout << (char)(i + ‘a’) << ” ‘ << 頻度[i]<< endl; }} int main(){cout<<"こんにちは世界"; countFre("abbaccbdd"); }

プログラムの出力は次のようになります。

a 2 b 3 2 c 2 c

アルゴリズムのO(N)の複雑さにより、他の線形アプローチと比較して高速になります.

衝突を解決する方法

ハッシュ関数の衝突を解決する独自の方法があります。一般的な方法の1つは、オープンハッシュとも呼ばれる個別のチェーンです。これは、チェーン内の各要素自体がリンクリストであるリンクリストで実装されます。このアプローチにより、要素を保存し、特定の要素が特定のリンクリストの一部にすぎないようにして、衝突を解決できます。つまり、2つの入力値が同じ出力ハッシュ値を持つことはできません.

 

Pythonでハッシュを探索する

このセクションでは、Pythonのハッシュについて簡単に説明します。 Pythonを選んだ理由は、読みやすく、誰でも問題なく使用できるからです。.

ハッシュは一般的な関数であるため、Pythonライブラリにすでに実装されています。モジュールを使用することで、オブジェクトを入力として提供し、ハッシュ値を返すことができます.

ハッシュメソッドの構文は次のとおりです。

ハッシュ(オブジェクト)

ご覧のとおり、オブジェクトである単一のパラメーターを取り込んでいます。オブジェクトは、整数、浮動小数点数、または文字列にすることができます.

hash()メソッドの戻り値は、入力によって異なります。整数の場合は同じ数値を返す可能性がありますが、10進数と文字列の場合は異なります.

以下のいくつかの例を見てみましょう.

num = 10 deci = 1.23556 str1 = "ニティッシュ" print(hash(num))print(hash(deci))print(hash(str1))

上記のコードの出力は次のとおりです。

ただし、ハッシュはすべてのオブジェクトタイプに適用できるわけではありません。たとえば、最初のプログラムでaからzのリストを作成したことを覚えている場合。ハッシュしようとすると、出力ウィンドウはTypeError:unhashable type: ‘list’を通過します。

オブジェクトリストにハッシュを適用するには、タプルを使用する必要があります.

vowels =( ‘a’、 ‘e’、 ‘i’、 ‘o’、 ‘u’)print(hash(vowels))出力⇒-5678652950122127926

暗号化におけるハッシュ

ハッシュは暗号化に役立ちます。ビットコインはハッシュを利用してマークルツリーを作成および管理します

また、ハッシュはかなり長い間暗号化の一部でした。ただし、ハッシュの最良の使用例は、パスワードをハッシュして保存することです。. 

マークルツリー

マークルツリーは、大規模なデータプールで安全なデータ検証を行う場合に役立つデータ構造です。ビットコインとイーサリアムはどちらも、オープンネットワークでデータを保存およびアクセスする際の多くの技術的障壁を解決するためにマークルツリーを利用しています.

データへのアクセスと保存の両方のソースが1つしかないため、集中型ネットワークではデータの保存とアクセスについて心配する必要はありません。ただし、分散型ネットワークがある場合は、参加している何百ものピア間でデータをコピーする必要があるため、方程式が変わります。.

マークルツリーは、ピア間でデータを共有および検証するための信頼できる効率的な方法を提供することにより、問題を解決します.

マークルツリーの例

しかし、なぜここでマークルツリーについて議論しているのでしょうか。マークルツリーは、ハッシュをコア機能として使用して、さまざまなノードとデータブロックを接続します.

マークルツリーは、トランザクションセット全体を要約できる逆さまのツリーです。.

マークルツリーと、それが暗号化でハッシュをどのように使用するかについて詳しく知りたい場合は、詳細ガイドを確認してください。

マークルツリーへのガイド。そこで、ビットコインやその他のユースケースでマークルツリーの実装がどのように行われるかについて説明しました.

マイニングプロセス

マイニングプロセスもハッシュを利用します。ビットコインマイニングに関しては、需要があるときに新しいブロックがブロックチェーンに追加されます.

ブロックをブロックチェーンに追加するには、メソッドに従う必要があります。新しいブロックが到着すると、ブロックのコンテンツに応じてハッシュ値が生成されます。また、生成されたハッシュがネットワークの難しさ以上のものである場合、ブロックチェーンにブロックを追加するプロセスが開始されます.

完了すると、ネットワーク内のすべてのピアが新しいブロックの追加を確認します.

ただし、ネットワークの難易度は、ほとんどの場合、生成されたハッシュと比較して常に高いため、これはめったにありません。マイニングプロセスで重要な役割を果たす別の側面があります。ノンスです.

ナンスはブロックのハッシュに追加され、任意の文字列です。完了すると、連結された文字列が難易度と比較されます。難易度が連結された文字列よりも低い場合、難易度が高くなるまでナンスが変更されます.

このプロセスは、次の手順で要約できます。

  • 新しいブロックが生成または取得されるたびに、コンテンツがハッシュされて新しいハッシュ値が作成されます,
  • 新しいナンス値が生成され、ハッシュに追加されます
  • ハッシュプロセスは、新しい接触ストリングで行われます。 
  • 次に、ハッシュの最終値がネットワークの難易度と比較されます
  •  最終的なハッシュ値がナンスよりも低い場合、プロセスが再度繰り返されます。プロセスは、ハッシュ値がナンスより大きい場合にのみ停止します.
  • 難易度が高くなると、ブロックがチェーンに加わります
  • その後、鉱夫は新しいブロックを採掘し、報酬を共有する責任を負います.

「ハッシュレート」という用語もここから入ります。ハッシュレートは、ハッシュ操作が行われるレートです。ハッシュレートが高いということは、マイナーがマイニングプロセスに参加するためにより多くの計算能力を必要とすることを意味します.

 

結論

これで、暗号化の詳細ガイドでのハッシュが終了します。ハッシュについて詳しく説明し、その背後にあるコードについても説明しました。.

それで、あなたはそれについてどう思いますか?以下にコメントしてお知らせください.

 

#よくある質問

暗号化におけるハッシュとは?

暗号化では、ハッシュは効率的な方法を使用してデータを一意のテキスト文字列に変換する方法です。また、データのタイプやサイズに制限はありません—ハッシュはそれらすべてで機能します.

暗号化でハッシュはどのように使用されますか?

暗号化では、ハッシュを利用してパスワードをハッシュしたり、一意の識別番号を生成したりします.