數據結構-哈希表(一)哈希函數、哈希表介紹、優缺點

哈希表

哈希函數

在這里插入圖片描述

哈希表使用了哈希函數來完成key到地址的快速映射,所以在了解哈希表之前,需要先明白哈希函數的概念和特點。

哈希函數的定義

  • 哈希函數
    • 哈希函數是一種將任意長度輸入的數據,轉換成固定長度輸出算法
    • 哈希函數H可以表示為y=H(x)
      • H指代哈希函數
      • x輸入數據,可以是任意長度
      • y輸出的哈希值,具有固定長度
  • Hashcode
    • 這部分被固定長度輸出的數據被稱為Hashcode哈希值散列值

哈希函數的特點

  • 確定性

    • 不管執行多少次,通過某個key所得到的內存數組索引位置(即哈希值)是不變
  • 固定長度輸出

    • 哈希函數的核心任務是將無限映射到有限,即不管輸入值數據大小是1kb還是1G,數據長度是1位還是1000位,它的通過哈希函數產生的哈希值長度都是固定的,具體輸出長度由算法決定
      • SHA-256算法輸出永遠是256位(32字節)
      • MD5算法輸出永遠是128位(16字節)
        在這里插入圖片描述
  • 單向性

    • 輸入值可以單向通過哈希函數獲得哈希值,但是通過哈希值不可以反向獲取輸入值原數據。哈希函數是一個“單向門”或“單向函數”。從 x 計算 H(x) 很容易,但從H(x)反推出 x 極其困難。
      • 這一點在密碼存儲上至關重要,系統可以存儲用戶密碼的哈希值,即時數據庫泄漏,攻擊者也無法輕易從哈希值還原出用戶的原始密碼
  • 高效性

    • 計算哈希值的過程快速且高效,即時是處理大量數據也能快速完成
    • 哈希函數算法是由簡單的位運算(與、或、非、異或、移位、旋轉)構成,這些操作在現代計算機上執行是非常快速的
  • 需要處理哈希沖突/哈希碰撞

    • 哈希函數因為是無限映射到有限,輸入空間是無限的,所以有可能出現兩個不同的輸入,對應了同一個哈希值,即出現了碰撞
    • 哈希函數設計目標需要盡可能的避免出現碰撞

引申問題1:哈希函數和加密函數的區別

  • 哈希函數和加密函數最大的區別是
    • 哈希函數是單向的,不可逆,即通過哈希值很困難找到原始值
    • 加密函數式雙向的,可逆(需密鑰解密),通過密文也可以找到原文
維度哈希函數 (Hash)加密函數 (Encryption)
可逆性單向,不可逆雙向,可逆(需密鑰解密)
密鑰無密鑰有密鑰(對稱或公私鑰)
輸出長度固定(如 256 位)可變(通常 ≥ 明文長度)
速度目標盡量快,便于校驗對稱快、非對稱慢,但都比哈希慢
碰撞必須抗碰撞(難以找到兩輸入同輸出)無碰撞概念(一對一映射)
典型應用密碼摘要、數據完整性、數字簽名機密傳輸、磁盤加密、HTTPS
示例算法SHA-256, BLAKE3, MD5AES, ChaCha20(對稱);RSA, ECC(非對稱)

引申問題2:MD5算法和SHA256算法是哈希函數還是加密函數

  • MD5算法和SHA256算法都是哈希算法,不算加密算法
    • 兩者都是任意長度的輸入,壓縮成固定長度摘要(SHA256為256bit,MD5為128bit)
    • 兩者都不設秘鑰,不可逆,不具備加密/界面功能
    • 常見用途
      • 校驗文件完整性
      • 數字簽名前置壓縮
      • 密碼存儲(配合鹽值和KDF)

引申問題3:位運算為什么快

  • 位運算是直接在CPU寄存器上用最簡硬件邏輯完成的
    • AND/OR/XOR/NOT/SHIFT 都只需少量晶體管組成的組合邏輯門(與門、或門、異或門、移位器)
  • 零內存訪問零復雜算法單周期延遲,是所有運算中成本最低

哈希表的定義

在這里插入圖片描述

定義

  • 哈希表是一種動態數據結構,以key-value鍵值對存儲數據
  • 核心思想是使用哈希函數key轉換為數組下標索引保存后,下次再次查詢時,使用仍然通過哈希函數將key轉化為數組下標,快速定位到數據的位置

目的

  • 實現快速數據存儲檢索
  • 注意,此處的快速檢索指的是通過key來查詢value是快速的;如果僅僅只是查找某個value,數據檢索效率并不高

核心公式

  • index = hash(key) mod capacity

組成部分

  • 哈希函數

    • 將key轉換為數組索引的算法
  • 數組

    • 用于存儲鍵值對數據的數組
  • 哈希沖突/碰撞解決方法

    • 因為哈希函數式無限(輸入)轉化為有限(輸出),一定存在不同的輸入產生相同的輸出,即碰撞(或稱為沖突)
    • 沖突/碰撞解決方法,指的是當碰撞發生時,不同key被映射到同一個數組下標索引時,如何處理,一般使用以下方法
      • 鏈表法
      • 開放尋址法

哈希表的優點

  • 操作高效

    • 增、刪、查操作的時間復雜度為O(1),非常高效
  • 實現簡單

    • 大多數編程語言中都有內置支持(Java的Hashmap;Python的dict)
  • 靈活性強

    • 可以存儲各種類型的鍵值對

哈希表的缺點

  • 哈希沖突處理

    • 哈希沖突處理不當,會影響性能
  • 空間浪費

    • 為了避免哈希沖突,一般都會預留較大內存空間
  • 不支持有序遍歷

    • 哈希表中的元素是無序的(因為保存時是通過hash函數計算出應該放在哪個數組下標,導致整體是隨機的)
  • 設計復雜

    • 需精心設計哈希與沖突策略、負載因子、并發、縮容等工程細節,難度較高

引申問題4:哈希表為什么操作這么高效

  • 哈希表操作時可以直接定位數據存儲位置(前提通過key來操作)

    • 哈希表的核心是哈希函數,哈希函數可以將key直接轉換為數據在數組中的下標,比如get(key)等同于直接查array[5],時間復雜度是常數時間 O(1)
  • 數據結構支持隨機訪問

    • 因為是直接查下標不需要遍歷數據
  • 哈希沖突處理優化

    • 對于可能存在的哈希沖突,哈希表會通過鏈表法開放尋址法來優化防止出現哈希沖突,從而減少哈希沖突對性能的影響

哈希表的應用場景

  • 快速查找

    • 通過索引key快速定位內容
    • 統計字符或單次出現的頻率
      • 計算方式:對于每個字符,如果它已經在哈希表(這一步可以使用哈希函數通過key快速索引)中,將對應的值加 1。
      • 如果它不在哈希表中,將其加入哈希表,值設為 1。
    • 快速判斷一個元素是否在數組中
  • 數據庫索引

    • 數據庫中的哈希索引(比如MySQL的Memory引擎)
  • 緩存系統

    • LRU 緩存(Least Recently Used Cache)常用哈希表 + 雙向鏈表實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915472.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915472.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915472.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Shader開發(一)什么是渲染

前言在現代游戲開發和計算機圖形學領域,渲染技術是連接虛擬世界與視覺呈現的關鍵橋梁。無論你是剛接觸圖形編程的新手,還是希望深入理解渲染原理的開發者,掌握渲染的核心概念都是必不可少的第一步。什么是渲染?渲染(Re…

策略模式+工廠模式(案例實踐易懂版)

最近,可以說這2025年度,自己更文的次數都大大減少,主要最近大環境不景氣,自己職業也受到波及,學習的東西也是因為AI而變得更多, 沒辦法,你不學,總有人會學,關于AI的我也準備出個專輯,相信絕對幫助到大家 額,好像說多了,言歸正傳,我們看一下今天的主題:策略模式工廠模式 本文主要…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - snowNLP庫實現中文情感分析

大家好,我是java1234_小鋒老師,最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程,持續更新中,計劃月底更新完,感謝支持。今天講解snowNLP庫實現中文情感分析 視頻在線地址&…

大根堆,小根堆,雙指針

碼蹄集OJ-大約 #include<bits/stdc.h> using namespace std; priority_queue<int>max2,maxDel; priority_queue<int,vector<int>,std::greater<int>>min2,minDel; const int N1e51; int n,result0,a[N]; int main( ) {cin>>n;for(int i1…

RS485和Modbus

UART協議中&#xff0c;空閑狀態為高電平&#xff0c;也就是1,R25和R27&#xff0c;485收發器特性MAX485 (美信)SSP485 (國產替代)AZRS3080 (安格)供電電壓5V5V3.3V ~ 5.5V靜態電流300μA (接收模式)120μA (接收模式)150μA (接收模式)傳輸速率2.5Mbps10Mbps20Mbps總線負載能力…

【Android】交叉編譯faiss庫 | 問題解決

目錄 一 解決 FAISS 交叉編譯到 Android 時的 BLAS/MKL 依賴問題 二 交叉編譯faiss ■禁用 BLAS并交叉編譯faiss ■使用 OpenBLAS 的 Android 移植版本并交叉編譯faiss 三 報錯處理 ■報錯 ■SWIG 一 解決 FAISS 交叉編譯到 Android 時的 BLAS/MKL 依賴問題

《使用 IDEA 部署 Docker 應用指南》

使用 IDEA 部署 Docker 應用的詳細步驟 一、創建 Dockerfile 配置文件 在項目根目錄下創建Dockerfile文件&#xff0c;配置內容如下&#xff1a; # 使用官方的OpenJDK鏡像作為基礎鏡像 FROM openjdk:17-jdk-slim# 設置維護者信息(可選) LABEL maintainer"三木豪"# 設…

【Docker#3】Window 和 Linux 上 docker安裝 相關知識

前置了解&#xff1a; X86 高并發&#xff1a;基于 x86 架構的處理器&#xff0c;在高負載下處理大量并發請求的能力。ARM &#xff1a;使用 ARM 架構處理器的移動設備&#xff0c;具有低功耗和高性能的特點。 操作系統&#xff1a; CentOS&#xff1a;基于 Red Hat Enterprise…

一次 POI 版本升級踩坑記錄

前言 結論先行。 開發過程中由于可能涉及到二次開發&#xff0c;若原系統開發時間久遠&#xff0c;沒有達成一致規范設計&#xff0c;導致風格各異&#xff0c;確實滿足當時開發場景&#xff0c;但增大了后續的更新的難度&#xff0c;容易出現俄羅斯套娃現象&#xff0c;新的更…

硬件設計學習DAY13——電源緩沖電路設計全解

每日更新教程&#xff0c;評論區答疑解惑&#xff0c;小白也能變大神&#xff01;" 目錄 一.緩沖電路介紹 1.1緩沖電路的作用 1.2寄生參數的來源 1.3緩沖電路的類型 1.4常見緩沖電路設計 1.5設計原則 二.吸收與緩沖 2.1吸收與緩沖的核心作用 2.2電壓尖峰與吸收措…

鴻蒙搜狐新聞如何在Native調用ArkTS方法

01前言鴻蒙作為一款新興的智能操作系統&#xff0c;現在適配鴻蒙系統的應用越來越多&#xff0c;同時會面臨三端兼容問題&#xff0c;如同一產品功能&#xff0c;需要維護iOS、Android、鴻蒙三端代碼。拿文件上傳、下載功能場景舉例&#xff0c;同時要適配iOS、Android、鴻蒙三…

Java行為型模式---中介者模式

中介者模式基礎概念中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是通過一個中介對象來封裝一系列對象之間的交互&#xff0c;使各對象不需要顯式地相互引用&#xff0c;從而降低耦合度&#xff0c;并可以獨立地改變它們之間…

Python爬蟲實戰:研究Korean庫相關技術

一、引言 1.1 研究背景與意義 隨著韓流文化在全球的傳播,韓語網頁內容急劇增加。韓國在科技、娛樂等領域的信息具有重要研究價值。然而,韓語獨特的黏著語特性(如助詞體系、詞尾變化)給信息處理帶來挑戰。傳統爬蟲缺乏對韓語語言特點的針對性處理,本研究旨在開發一套完整…

表單校驗--數組各項獨立校驗

寫需求時遇到一個這樣的問題&#xff0c;就是校樣項是多個的&#xff0c;但是其字段名稱相同這時我們可以這樣校驗&#xff0c;注意字段之間的關聯性<div v-for"(item,index) in formData.hospitalDoctorList" :key"item.key || index"><el-form-…

基于SpringBoot和leaflet-timeline-slider的歷史敘事GIS展示-以哪吒2的海外國家上映安排為例

目錄 前言 一、哪吒2的海外之路 1、海外征戰歷程 2、上映國家空間查詢 二、后端接口的實現 1、模型層的實現 2、上映時間與國家 3、控制層的實現 三、基于leaflet-timeline-slider的前端實現 1、時間軸控件的引入及定義 2、時間軸綁定事件 3、成果展示 四、總結 前言…

tar 解壓:Cannot change ownership to uid 1000, gid 1000: Operation not permitted

tar 解壓 tar.gz 壓縮包報錯&#xff1a; # tar xzf $INPUT_FOLDER/archive.tar.gz -C /mnt/test-nas/[..] tar: xx.jpg: Cannot change ownership to uid 1000, gid 1000: Operation not permitted原因是用普通用戶執行的解壓縮腳本&#xff0c;用root用戶執行tar解壓縮&…

騰訊客戶端開發面試真題分析

以下是針對騰訊客戶端開發工程師面試問題的分類與高頻問題分析&#xff08;基于??105道問題&#xff0c;總出現次數118次??&#xff09;。按技術領域整合為??7大類別??&#xff0c;按占比排序并精選高頻問題標注優先級&#xff08;1-5&#x1f31f;&#xff09;&#x…

線上問題排查之【CPU飆高100%】

目錄 案例 發現問題 排查問題 步驟一 步驟二 步驟三 案例 import java.util.concurrent.TimeUnit;/*** 簡單寫一個CPU飆高的案例*/ public class CpuLoadUp {// 這里定義了一個標識private volatile static int flag 0;public static void main(String[] args) {// 執行…

c語言 進階 動態內存管理

動態內存管理1. 為什么存在動態內存分配2. 動態內存函數的介紹?2.1 malloc 和 freemalloc 函數free 函數2.2內存泄漏2.3 calloc2.4 realloc3. 常見的動態內存錯誤3.1 對NULL指針的解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放一塊…

Redis的五大基本數據類型

一、Redis基本知識與Redis鍵&#xff08;key&#xff09;常用操作命令。redis的默認端口6379。mysql默認端口號3306。 默認16個數據庫&#xff0c;類似數組的下標從0開始&#xff0c;初始默認使用0號庫。可以使用select index來切換數據庫&#xff0c;如&#xff1a;select 1&a…