# 哈希算法
## 哈希算法的概念和特性
> 我們前面分享了散列表、散列函數和散列沖突,其實也可以譯作哈希表、哈希函數和哈希沖突,是一個意思。哈希算法簡單理解就是實現前面提到的哈希函數的算法,用于將任意長度的二進制值串映射為固定長度的二進制值串,映射之后得到的二進制值就是哈希值(散列值)。
>
> 我們日常開發中最常見的哈希算法應用就是通過 md5 函數對數據進行加密了,md5 就是一個哈希函數,結合 md5 我們可以歸納出哈希算法的一般特性:
> 1. 從哈希值不能反向推導出原始數據(所以哈希算法也叫單向算法,不可逆)
> 2. 對輸入數據非常敏感,哪怕原始數據只修改了一個比特,最后得到的哈希值也大不相同
> 3. 散列沖突的概率要很小,對于不同的原始數據,哈希值相同的概率非常小
> 4. 哈希算法的執行效率要盡量高效,針對較長的文本,也能快速地計算出哈希值
## 哈希算法的應用
> 1、場景一:安全加密
>
>
>
> 我們日常用戶密碼加密通常使用的都是 md5、sha等哈希函數,因為不可逆,而且微小的區別加密之后的結果差距很大,所以安全性更好。
>
>
>
> 2、場景二:唯一標識
>
>
>
> 比如我們的 URL 字段或者圖片字段要求不能重復,這個時候就可以通過對相應字段值做 md5 處理,將數據統一為 32 位長度從數據庫索引構建和查詢角度效果更好,此外,還可以對文件之類的二進制數據做 md5 處理,作為唯一標識,這樣判定重復文件的時候更快捷。
>
>
>
> 3、場景三:數據校驗
>
>
>
> 比如我們從網上下載的很多文件(尤其是P2P站點資源),都會包含一個 MD5 值,用于校驗下載數據的完整性,避免數據在中途被劫持篡改。
>
>
>
> 4、場景五:散列函數
>
>
>
> 前面我們已經提到,PHP 中的 md5、sha1、hash 等函數都是基于哈希算法計算散列值
>
>
>
> 5、場景五:負載均衡
>
>
>
> 對于同一個客戶端上的請求,尤其是已登錄用戶的請求,我們需要將其會話請求都路由到同一臺機器,以保證數據的一致性,這可以借助哈希算法來實現,通過用戶 ID 尾號對總機器數取模(取多少位可以根據機器數定),將結果值作為機器編號。
>
>
>
> 6、場景六:分布式緩存
>
>
>
> 分布式緩存和其他機器或數據庫的分布式不一樣,因為每臺機器存放的緩存數據不一致,每當緩存機器擴容時,需要對緩存存放機器進行重新索引(或者部分重新索引),這里應用到的也是哈希算法的思想。后面我們介紹 Redis 系列的時候會系統闡述這一塊。
>
>
>
> 關于散列表的理論介紹至此告一段落,明天我們將就 PHP 數組實現原理來剖析 PHP 底層如何通過散列表實現數組。
- PHP操作集合
- 獲取字符首字母
- PHP實現定時備份MySQL數據庫
- PHP定時發送郵件
- PHP基本語法
- 總結
- 命名空間
- 錯誤抑制符
- 位運算符
- 原碼,反碼,補碼
- traits
- PHP的反射機制
- const和define的區別
- 語法
- 常用的函數
- 1.變量及打印函數
- 2.引入文件
- 3.常量
- 4.錯誤處理
- 5.面向對象
- 數據結構與算法
- 結構
- 數組
- 索引
- 散列表(哈希表)
- 棧
- 隊列
- 鏈表
- 算法
- 排序算法
- 插入排序
- 冒泡排序
- 選擇排序
- 歸并排序
- 快速排序
- 查找算法
- 二分查找
- 二分查找變形版本1:查詢數據在序列中第一次出現
- 哈希算法
- 算法復雜度
- Smarty模板引擎
- composer
- yaf
- yaf的安裝配置
- 其它
- Java
- JavaSE
- 1.Java發展及JDK安裝配置
- 2.Eclipse的下載及安裝
- 3.Java開發基礎
- 虛擬機
- 2.編輯虛擬機設置
- 1.虛擬機下安裝centos
- 3.安裝vmtools
- Linux
- 1.vi和vim編輯器
- 2.開機、重啟和用戶登錄注銷
- 3.用戶管理
- 4.用戶組管理
- 5.用戶和組的相關文件
- 6.linux運行級別
- 7.幫助指令
- 8.文件目錄類指令
- 9.時間日期類
- 10.搜索查找類
- 11.壓縮和解壓縮
- 12.組管理和權限管理(難點,重點)
- 虛擬主機的配置
- phpstudy快捷配置
- 配置文件配置
- PHP面向對象高級特性
- SPL標準庫(PHP標準庫)
- PHP鏈式操作的實現
- 面向對象編程的基本原則
- 設計模式
- 基本的設計模式