目次
ハッシュ関数の最もクールなアプリケーション-ブロックチェーン
データネックレス-ハッシュとリストの間の妥協、O(1)とO(n)の間の妥協
バックグラウンド
ハッシュ:ハッシュ
- 上記のように、データ項目がサイズでソートされている場合、アルゴリズムの複雑さを軽減するために二分探索が使用されます
- 新しいデータ構造を構築して、検索アルゴリズムの複雑さをO(1)に減らします。
- データ項目の場所についてより多くの事前知識を持っている必要があります
ハッシュ表
- すべての保管場所-スロット、各スロットには一意の名前があります
残りを見つける方法を使用して、ハッシュテーブルを取得します
- 負荷率:データ項目が占めるスロットの割合
完璧なハッシュ関数
ハッシュ関数が各データ項目を異なるスロットにマップできる場合、このハッシュ関数は「完全なハッシュ関数」と呼ばれます。
データ項目は頻繁に変更されますが、完璧なハッシュ関数を設計するにはどうすればよいですか?
優れたハッシュ関数には特徴があります
- 最小限の競合(ほぼ完璧)
- 計算の難易度が低い(追加のオーバーヘッドが少ない)
- データ項目を完全に分散させる(スペースを節約する)
応用
「指紋機能」
- 圧縮率-任意の長さのデータから取得された「指紋」の長さは固定されています
- 計算のしやすさ-元のデータから「指紋」を計算するのは簡単で、指紋から元のデータを計算することはほとんど不可能です。
- 変更耐性-元のデータにわずかな変更を加えると、「フィンガープリント」に大きな変更が発生します
- 競合防止-元のデータと「指紋」を知っているため、同じ指紋を持つデータを見つけることは非常に困難です(偽造)
例
import hashlib
hashlib.md5("hello world!").hexdigest()
hashlib.sha1("hello world!").hexdigest()
# 还可以用update方法
m = hashlib.md5()
m.update("hello world!")
m.update("this is part #2")
m.hexdigest()
- パスワードを暗号化された形式で保存する
- ファイルの改ざんを防ぐ
- 宝くじ賭けアプリケーション
ハッシュ関数の最もクールなアプリケーション-ブロックチェーン
意味
ブロックチェーンは分散データベースです
ネットワークを介して接続されたノード、各ノードはデータベース全体のすべてのデータを保存し、任意の場所に保存されたデータが同期されます
本質的な特徴
分散化:コントロールセンターまたは調整センターノードはありません。すべてのノードは等しく、制御できません
ワークロードの証明:ワークロードが多い人は誰でも、ネットワーク全体の変更をマスターします。
ハッシュ計算は非常に簡単に計算できませんか?なぜ大規模な計算を支払うのですか?
計算が難しいため、分散ネットワーク全体の同期を容易にするために、新しいブロックの生成速度が制御されます。
ハッシュ関数の設計
折り方
平方取中法
非数値的扱い
重みを増やすことはアナグラムを処理するための良い方法ですが、計算量が増えます
したがって、ハッシュ関数はストアドプロシージャと検索プロセスの計算負荷になることはありません。そうでない場合は、順次検索とバイナリ検索を直接実行できます。
ハッシュの競合解決
検出方法をスキップ
再ハッシュ
ハッシュテーブルの長さは、均一な分散を保証するために素数に設定されます
2回目の検出
データネックレス-ハッシュとリストの間の妥協、O(1)とO(n)の間の妥協
抽象データ型のマッピングとその実装
抽象データ型「マッピング」:ADTマップ
コード例
H=HashTable()
H[54]="cat"
H[24]="dog"
print(H.slots)
print(H.data)
print(H[24]) # dog
print(H[20]) # None
class HashTable:
def __init__(self):
self.size = 11
self.slots = [None]*self.size
self.data = [None]*self.size