雜湊 Hash
你有用過果汁機嗎?
我們只要將各式各樣、雜七雜八的蔬果通通丟入果汁機,經過處理之後,最後都會變成壓榨液體,這種物品 A 透過某些處理之後變成物品 B 的例子還有哪些呢?
像是研磨器,把各式各樣、雜七雜八的堅果丟進去,最後會被磨小變成粉末,那物品 B 可以變回物品 A 嗎?要說一句經典老話:回不去了 XD,所以電腦科學中蠻常使用這種方式在幫我們的帳戶密碼做加密,因為只有你自己知道要丟入哪些堅果,才能不斷的製造出特殊成分的粉末,其它人只看看到那堆粉末,無法猜到原始的材料
雜湊從字面上的意思來說,就是將原始資料,透過一種特殊複雜的公式,湊成另一種格式
上述的果汁機或研磨機,就像特定公式,會將原始資料運算為其它的資料,我們可以將運算完的結果拿去做額外的利用
定義
資料 A透過某個公式轉換成資料 B- 不可逆
雜湊的應用
蠻多都會用在加密或驗證的領域,像是:
- 身分證字號
我們的身分證字號不能隨便亂打,有些系統在用戶輸入身分證字號時,會去驗證身分證是否為合法的字串,那個驗證的公式大家可以自己 google 看看 - MD5 演算法(Message-Digest Algorithm)
是一種密碼雜湊函式,可以到這個網站 www.md5.cz/ 將文字輸入,按下 hash 按紐就會得到另一串文字,像是輸入test就會得到098f6bcd4621d373cade4e832627b4f6,但雜湊是不可逆的,無法從098f6bcd4621d373cade4e832627b4f6反推回test,如果今天輸入tesa,只差一個字,但得到的雜湊值會長得完全不一樣,所以 MD5 常常用來儲存用戶的密碼,系統不會保存使用者原始的密碼,因為這樣資料庫如果被駭客侵入,密碼就會被知道,所以一般來說會將密碼以 MD5 加密後再存入資料庫,等下次用戶登入輸入密碼時,再將密碼做 MD5 運算,將其結果跟資料庫的內容比對即可,這樣的做法相對安全,因為只有用戶自己才會知道他自己的原始密碼為何,如果今天用戶忘記密碼,就請用戶重新設定即可,因為系統人員無法回推用戶的原始密碼
連結串列 (Chaining)
雜湊表一開始會在每個位置準備各自的串列,同一個位置可存放多筆資料,以連結串列相接起來
就是一個數值一定有屬於它的存放位置,那這個存放位置不是隨隨便便亂存的,是要根據某個雜湊函數所推估出來的,所以一個值除了他自己本身之外,我們還要知道這個值是被存在哪裡,就必須透過雜湊表去查詢,雜湊表包含索引位置跟數值,類似 key 與 value 的概念,只要我們透過雜湊函式得到 key ,則我們要取得 value ,就是輕而易舉的事情囉