ハッシュ関数のイメージを掴むために、簡単な例を考えてみる。
まず、任意の文字列が与えられたとき、文字列中の全ての文字コードを加えた値を返す関数を考える。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# hash_0.py # 任意の文字列のhashを返す関数。 # 文字列中の文字コードを単純に足し込んでいく def make_hash(str): buffer = 0 char_list = list(str) # すべての文字のコードを加える for c in char_list: buffer += ord(c) # 加えた結果を16進文字列にして返す return(format(buffer, 'X')) |
この関数を以下のような文字列で実行すると、1文字加えたり入れ替えただけで結果が違ってくるのがわかる。
1 2 3 |
print(make_hash("America")) # 2B2 print(make_hash("American")) # 320 print(make_hash("america")) # 2D2 |
長い文字列で試してみると、1文字入れ替えると値が変わってくるが、1文字分の足し込むコードが変わるだけなので、大きな変化は期待できない。
1 2 |
print(make_hash("The rain in Spain stays mainly in the plain.")) # FB5 print(make_hash("The rain in spain stays mainly in the plain.")) # FD5 |
この方法で致命的なのは、同種の文字を順序違いで並べても結果が同じになる点。
1 2 |
print(make_hash("AB")) # 83 print(make_hash("BA")) # 83 |
このやり方は、あまりに単純すぎて使えない。