密码学-hash散列表
生活随笔
收集整理的這篇文章主要介紹了
密码学-hash散列表
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
hash散列表
哈希表(也叫散列表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)。也就是說(shuō),它通過(guò)把關(guān)鍵碼值映射到表中一個(gè)位置來(lái)訪問(wèn)記錄,以加快查找的速度。這個(gè)映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表。
下面我們來(lái)寫(xiě)一個(gè)簡(jiǎn)單的hash散列表,首先對(duì)上一節(jié)中的代碼我們做一些改進(jìn),在這里我們聲明一個(gè)結(jié)構(gòu)體類型,作為幾點(diǎn)數(shù)據(jù)的類型,然后對(duì)代碼的參數(shù)進(jìn)行一些修改。
接下來(lái)我們來(lái)創(chuàng)建一個(gè)新的文件夾HashMp,然后創(chuàng)建新的文件MyHashMap.go,在這里我們聲明一個(gè)長(zhǎng)度為16的數(shù)組,如果想改成32或者64等其他長(zhǎng)度的數(shù)組,要對(duì)散列算法進(jìn)行更改。
package HashMpimport ("MyHashMap/LinkNodes""fmt" )//聲明全局?jǐn)?shù)組 var bultArr [16]*LinkNodes.Node//給數(shù)組初始化 func CreateBulet() {var arr = [16]*LinkNodes.Node{}for i := 0; i < 16; i++ {arr[i] = LinkNodes.CreateHeadNode("頭節(jié)點(diǎn)", "頭節(jié)點(diǎn)")}bultArr = arr }//將key轉(zhuǎn)換成數(shù)組下標(biāo)的散列算法 func HashCode(key string) int {var index int = 0index = int(key[0])for k := 0; k < len(key); k++ {//1103515245是十六位的hash因子散列值index *= (1103515245 + int(key[k]))}index >>= 27index &= 16 - 1return index }//向數(shù)組中添加健值對(duì) func AddKeyValue(k string, v string) {//計(jì)算建所對(duì)應(yīng)的木桶下表var pos = HashCode(k)//獲得木桶數(shù)組var head *LinkNodes.Node = bultArr[pos]//向指定下標(biāo)的頭節(jié)點(diǎn)添加節(jié)點(diǎn)LinkNodes.AddNode(k, v, head) }//獲取數(shù)據(jù) func GetValueByKey(k string) string {var pos = HashCode(k)var head *LinkNodes.Node = bultArr[pos]//通過(guò)頭節(jié)點(diǎn)遍歷列表//LinkNodes.ShowNodes(head)//查找對(duì)應(yīng)下標(biāo)下的鏈表,判斷在key域節(jié)點(diǎn)中的key一致時(shí)打印for {if head.Data.K == k {fmt.Println(head.Data.V)break} else {head = head.NextNodeif head.NextNode == nil {}} } return ""}在主函數(shù)中使用方法:
package mainimport ("MyHashMap/HashMp""fmt" )func main() {fmt.Println("Hello World!")//測(cè)試hashMp八下的散列因子是否平均分布//fmt.Println(HashMp.HashCode("三羊"))HashMp.CreateBulet()HashMp.AddKeyValue("abc","hello")HashMp.AddKeyValue("bcd","world")HashMp.GetValueByKey("bcd") }輸出內(nèi)容為:
Hello World!world總結(jié)
以上是生活随笔為你收集整理的密码学-hash散列表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。