搜尋
首頁web前端js教程javascript hash是什麼

javascript hash是什麼

Nov 19, 2021 pm 04:20 PM
hashjavascript

在javascript中,hash指的是哈希表,是一種根據關鍵字直接存取記憶體儲存位置的資料結構;透過雜湊表,資料元素的存放位置和資料元素的關鍵字之間建立起某種對應關係,建立這種對應關係的函數稱為雜湊函數。

javascript hash是什麼

本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

javascript hash的基本概念:

#哈希表(hash table )是一種根據關鍵字直接存取記憶體儲存位置的數據結構,透過雜湊表,資料元素的存放位置和資料元素的關鍵字之間建立起某種對應關係,建立這種對應關係的函數稱為雜湊函數。
javascript hash是什麼
雜湊表的建構方法:

假設要儲存的資料元素數量是n,設定一個長度為m(m > n)的連續儲存單元,分別以每個資料元素的關鍵字Ki(0

從數學的角度看,哈希函數實際上是關鍵字到內存單元的映射,因此我們希望通過哈希函數通過盡量簡單的運算使得哈希函數計算出的花溪地址盡量均勻的背影射到一系列的記憶體單元中,建構雜湊函數有三個要點:(1)運算過程要盡量簡單高效,以提高哈希表的插入和檢索效率;(2)哈希函數應該具有較好的雜湊型,以降低雜湊衝突的機率;第三,雜湊函數應具有較大的壓縮性,以節省記憶體。

常用方法:

  • 直接位址法:以關鍵字的某個線性函數值為雜湊位址,可以表示為hash(K)=aK C;優點是不會產生衝突,缺點是空間複雜度可能會較高,適用於元素較少的情況。
  • 除留餘數法:它是由資料元素關鍵字除以某個常數所留的餘數為雜湊位址,該方法計算簡單,適用範圍廣,是經常使用的一種雜湊函數,可以表示為:
    hash(K=K mod C;該方法的關鍵是常數的選取,一般要求是接近或等於哈希表本身的長度,研究理論表明,該常數選素數時效果最好
  • 數字分析法:此方法是取資料元素關鍵字中某些取值較均勻的數字作為雜湊位址的方法,這樣可以盡量避免衝突,但是此方法只適合所有關鍵字已知的情況,對於想要設計出更通用的哈希表並不適用。
  • 平方求和法:對當前字符串轉換為Unicode值,並求出這個值的平方,去平方值中間的幾位為目前數字的hash值,具體取幾位元要取決於目前雜湊表的大小。
  • 分段求和法:根據目前雜湊表的位數把所要插入的數值分成若干段,把若干段相加,捨去調最高位結果就是這個值的雜湊值。

雜湊衝突的解:

在構造哈希表時,存在這樣的問題:對於兩個不同的關鍵字,透過我們的哈希函數計算哈希地址時卻得到了相同的哈希地址,我們將這種現象稱為哈希衝突。

javascript hash是什麼

雜湊衝突主要與兩個因素有關

(1)填充因子,填入因子是指雜湊表中已儲存入的資料元素個數與哈希位址空間的大小的比值,a=n/m ; a越小,衝突的可能性就越小,相反則衝突可能性較大;但是a越小空間利用率也就越小,a越大,空間利用率越高,為了兼顧哈希衝突和儲存空間利用率,通常將a控制在0.6-0.9之間,而.net中的HashTable則直接將a的最大值定義為0.72 (雖然微軟官方MSDN中聲明HashTable預設填裝因子為1.0,但實際上都是0.72的倍數)
(2)與所使用的哈希函數有關,如果哈希函數得當,就可以使哈希位址盡可能的均勻分佈在雜湊位址空間上,從而減少衝突的產生,但一個良好的雜湊函數的得來很大程度上取決於大量的實踐。

1)開放定址法

Hi=(H(key) di) MOD m i=1,2,…k(k 其中H(key)為雜湊函數;m為哈希表表長;di為增量序列。有3中增量序列:
①線性探測再散列:di=1,2,3,…,m-1
②二次探測再散列:di=1##2,- 12,22,-22,…±k^2(k ③偽隨機探測再散列:di=偽隨機數序列

缺點:

我們可以看到一個現象:當表中i,i 1,i 2位置上已經填入記錄時,下一個雜湊位址為i,i 1,i 2和i 3的記錄都會填入i 3的位置,這種在處理衝突過程中發生的兩個第一個哈希地址不同的記錄爭奪同一個後繼哈希地址的現象稱為“二次聚集”,即在處理同義詞的衝突過程中又加入了非同義詞的衝突。但另一方面,用線性探測再散列處理衝突可以保證做到:只要雜湊表未填滿,總是能找到一個不發生衝突的位址Hk。而二次探測再散列只有在哈希表長m為形如4j 3(j為整數)的素數時才可能。即開放定址法會造成二次聚集的現象,對查找不利。

javascript hash是什麼
2)再雜湊法

Hi = RHi(key),i=1,2,…k RHi皆是不同的雜湊函數,即在同義詞產生位址衝突時計算另一個雜湊函數位址,直到不發生衝突為止。這種方法不易產生聚集,但是增加了計算時間。

缺點:增加了計算時間。

3)鏈結位址法(拉鍊法)

將所有關鍵字為同義詞的記錄儲存在同一線性鍊錶中。

優點:

①拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查找長度較短;
②由於拉鍊法中各鍊錶上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
③開放定址法為減少衝突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中增加的指針域可忽略不計,因此節省空間;
④在用拉鍊法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪除鍊錶上對應的結點即可。而對開放位址法構造的散列表,刪除結點不能簡單地將被刪結 點的空間置為空,否則將截斷在它之後填人散列表的同義詞結點的查找路徑。這是因為在各種開放地址法中,空地址單元(即開放地址)都是查找失敗的條件。因此在 用開放位址法處理衝突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。

缺點:

拉鍊法的缺點是:指標需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指針空間用來擴大散列表的規模,可使裝填因子變小,這又減少了開放定址法中的衝突,從而提高平均查找速度。

javascript hash是什麼

4)建立一個公共溢出區

假設雜湊函數的值域為[0,m-1],則設向量HashTable[0…m-1]為基本表,每個分量存放一個記錄,另設立向量OverTable[0…v]為溢位表。所有關鍵字和基本表中關鍵字為同義詞的記錄,不管他們由雜湊函數得到的雜湊位址是什麼,一旦發生衝突,都填入溢位表。

一個簡單雜湊函數不做衝突處理的雜湊表實作

class Hash {
  constructor() {
    this.table = new Array(1024);
  }
  hash(data) {
    //就将字符串中的每个字符的ASCLL码值相加起来,再对数组的长度取余
    var total = 0;
    for (var i = 0; i < data.length; i++) {
      total += data.charCodeAt(i);
    }
    console.log("Hash Value: " + data + " -> " + total);
    return total % this.table.length;
  }
  insert(key, val) {
    var pos = this.hash(key);
    this.table[pos] = val;
  }
  get(key) {
    var pos = this.hash(key);
    return this.table[pos]
  }
  show() {
    for (var i = 0; i < this.table.length; i++) {
      if (this.table[i] != undefined) {
        console.log(i + ":" + this.table[i]);
      }
    }
  }
}
var someNames = ["David", "Jennifer", "Donnie", "Raymond", "Cynthia", "Mike", "Clayton", "Danny", "Jonathan"];
var hash = new Hash();
for (var i = 0; i < someNames.length; ++i) {
  hash.insert(someNames[i], someNames[i]);
}

hash.show();

javascript hash是什麼
# 採用的是平方取中法建構雜湊函數,開放位址法線性探測法進行解決衝突。

class Hash {
  constructor() {
    this.table = new Array(1000);
  }
  hash(data) {
    var total = 0;
    for (var i = 0; i < data.length; i++) {
      total += data.charCodeAt(i);
    }
    //把字符串转化为字符用来求和之后进行平方运算
    var s = total * total + ""
    //保留中间2位
    var index = s.charAt(s.length / 2 - 1) * 10 + s.charAt(s.length / 2) * 1
    console.log("Hash Value: " + data + " -> " + index);
    return index;
  }
  solveClash(index, value) {
    var table = this.table
    //进行线性开放地址法解决冲突
    for (var i = 0; index + i < 1000; i++) {
      if (table[index + i] == null) {
        table[index + i] = value;
        break;
      }
    }
  }
  insert(key, val) {
    var index = this.hash(key);
    //把取中当做哈希表中索引
    if (this.table[index] == null) {
      this.table[index] = val;
    } else {
      this.solveClash(index, val);
    }
  }
  get(key) {
    var pos = this.hash(key);
    return this.table[pos]
  }
  show() {
    for (var i = 0; i < this.table.length; i++) {
      if (this.table[i] != undefined) {
        console.log(i + ":" + this.table[i]);
      }
    }
  }
}
var someNames = ["David", "Jennifer", "Donnie", "Raymond", "Cynthia", "Mike", "Clayton", "Danny", "Jonathan"];
var hash = new Hash();
for (var i = 0; i < someNames.length; ++i) {
  hash.insert(someNames[i], someNames[i]);
}

hash.show();

javascript hash是什麼

【推薦學習:javascript進階教學

以上是javascript hash是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
從C/C到JavaScript:所有工作方式從C/C到JavaScript:所有工作方式Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript引擎:比較實施JavaScript引擎:比較實施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境