數據結構應用之散列函數

 基本概念

“散列函數”通常我們也叫他“哈希函數”。他相當於一個給某個數據加個指紋的函數。一個數據通過散列函數的作用會有唯一的值與之對應。我們把這個數據叫做“鍵”,這個“鍵”通過散列函數作用後的值叫做“值”。

應用場景

1、加密

有些時候我們希望把某些數據加密,加密的目的當然是不希望有人知道我們的原數據只有我們自己知道纔好。當然更不希望別人拿到我們的密文後輕易就能破解出我們的明文。於是散列函數就起作用了。我們的明文相當於“鍵”而密文就是“值”加密的函數就是散列函數。例如我們常用的MD5,他實際上就是一種非對稱散列函數,就是說通過我們的鍵可以知道值,但是通過值求不出鍵。從數學角度講就是一個不存在反函數的函數。

舉例

比如我們在做網站註冊登陸系統時往往對密碼進行md5加密後再存入數據庫,這樣保護了用戶的安全性,因爲即使有人看到了數據庫裏的密碼也不知道你真正的密碼是什麼

再比如我們下軟件的時候網站通常給我們一個md5值,我們下完後可以根據這個值進行驗證,這樣防止了軟件被惡意竄改或傳輸過程有誤。

2、查找

這是散列的另一個重要應用,想想我們原來的查找一般是基於比對的,也就是一個一個地找,例如在一個數組中找最大值之類的問題,如果排好序的還可以用二分查找一個一個找,總之是要有個過程的這樣在數據量特別大的時候是有效率問題的。那麼我們爲什麼不能通過要找的東西直接獲得他的位置呢,這就是散列函數的作用了。我們可以用一個數據直接構造他的存儲地址add=Hash(data)這樣效率會非常高

舉例

現在有一種新概念叫NoSql,這種產品很多例如memcachedDB,redis,MongoDB,Cassandra,TokyoCabinet這些花樣繁多的Nosql數據庫其原理都是基於鍵值存儲(Key/Value)的也就是散列函數,他們之所以有很高的效率是因爲他們的數據都是直接定位的,查找的時間是O(1)的。而關係型數據庫的查找是很慢的特別在數據量非常大的時候。當然這些產品還有很多其他的技術來保證高的性能和可靠性這裏就不討論了。

再比如在模式識別中,你想識別一個人的臉或某種聲音總不能在庫裏一個一個比對吧,當然會直接利用某種魯棒性的散列函數來查找數據,這也類似於我們人腦的原理,我們識別一個人的時候肯定不是先把認識的人想一遍然後看看他到底是誰呢?我們總是能一下子就認出來,即使他今天換了個頭型我們也能認出來,這就是我們的大腦用了魯棒性很好的散列函數識別了我們看到的人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章