Hashアルゴリズム(python実装を含む)


1.概要
ハッシュ(hash)もハッシュとして翻訳される.Hashアルゴリズムは,一定長の入力をハッシュ関数により一定長の出力,すなわちハッシュ値に変換する.
このハッシュ変換は一方向演算であり,不可逆性を有し,ハッシュ値に基づいて入力情報を復元できないため,厳密にはHashアルゴリズムはメッセージ要約アルゴリズムであり,暗号化アルゴリズムではない.一般的なhashアルゴリズムには,SM 3,MD 5,SHA−1などがある.
2.応用
Hashは主にデータ構造および暗号学の分野に応用されている.
異なる適用シーンではhash関数の選択も重視されます.例えば、データ構造を管理する際、主に演算の迅速性を考慮し、hashの均一な分布を保証しなければならない.暗号学に適用するには、衝突に対する耐性を優先し、2つの異なる明文hash値が同じ場合を避ける必要があります.
2.1暗号学の分野での応用
暗号学では,Hashアルゴリズムの役割は主にメッセージの要約と署名に用いられ,言い換えれば,メッセージ全体の整合性を検証するために主に用いられる.例えば、一部のログインサイトでは、ユーザーパスワードが直接明文で格納されず、hash処理されたパスワードの要約(hash値)が格納されており、ユーザーがログインする際に入力明文の要約とデータベースに格納されている要約が同じかどうかを比較する必要がある.ハッカーが侵入したり、保守者がデータベースにアクセスしたりしても、ユーザーのパスワードの明文を取得できず、セキュリティが大幅に向上します.
2.2データ構造における応用
Hashアルゴリズムを用いたデータ構造はハッシュテーブル,ハッシュリストとも呼ばれ,主にクエリの効率化のためである.キー値をテーブルの1つの場所にマッピングすることで、レコードにアクセスし、検索を高速化します.このマッピング関数はhash関数であり,記録を格納する配列をハッシュテーブルと呼ぶ.データ構造に適用する場合、衝突に対する耐性を考慮して高い演算速度を必要とし、独自に構築したハッシュ関数を使用することができる場合があります.
3.Hashアルゴリズムのpython実装
3.1カスタムハッシュ関数
カスタムハッシュ関数は、通常、残留数、シフト、サイクルハッシュ、二乗抽出などの方法を利用することができる.次の例は私自身が定義したハッシュ関数であり,型取り演算と異或演算を用いた.
# coding:utf-8
#        

def my_hash(x):
    return (x % 7) ^ 2

print(my_hash(1)) #     :3
print(my_hash(2)) #     :0
print(my_hash(3)) #     :1
print(my_hash(4)) #     :6

3.2 hash()関数
pythonに組み込まれたハッシュ関数hash()は、リスト、set、dictionaryに直接使用できないオブジェクト(数値、文字列)のハッシュ値を返します.サンプルコードは次のとおりです.
# coding:utf-8
# hash()

print(hash(1))
print(hash(1.0))    #      ,    ,       
print(hash("abc"))
print(hash("hello world"))

同じ文字列の同じ実行時のハッシュ値は同じですが、同じ実行時のハッシュ値は異なります.これはPythonの文字列hashアルゴリズムが起動時にsecret prefix/suffixをランダムに生成するメカニズムがあり、同じ文字列に入力すると、解釈プロセスによって得られるhash結果が異なるランダム化現象があるためである.したがって、プロセス間で一貫性を保つhashを再現する必要がある場合、hashlibモジュールを使用する必要がある.
3.3 hashlibモジュール
hashlibはMD 5,SHA 1などの一般的な要約アルゴリズムを提供する.サンプルコードは次のとおりです.
# coding:utf-8
#   hashlib  
import hashlib

md5 = hashlib.md5()     #   MD5  
data = "hello world"
md5.update(data.encode('utf-8'))
print(md5.hexdigest())