数据结构 in Golang:Hash Tables(哈希表)
Posted 小乔的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 in Golang:Hash Tables(哈希表)相关的知识,希望对你有一定的参考价值。
数据结构 in Golang:Hash Tables(哈希表)
场景
- 水果店的价格表:
- 苹果 Apple:3元
- 香蕉 Banana:4元
- 桃子 Peach:2元
- 梨 Pear:3元
- 找到一种水果的价格:
- 可以使用 binary search,通过名称来查找,耗时:O(logn)
- 如何只耗时 O(1) 来找到价格呢?
Hash 函数
- Hash 函数:通过一个字符串 -> 一个数值
- 例如:
- "Apple" -> 1
- "Banana" -> 2
- "Peach" -> 7
- "Pear" -> 8
- 将字符串映射为数值
Hash 函数的要求
- 一致性
- 将不同的字符串映射为不同的数值
Hash 函数有什么用?
方便 快捷的得到自己想要的值...
Hash Table
- Hash 函数 + 数组 = Hash Table
- 数组直接映射到内存
- Hash Table 具有额外的逻辑,它使用 Hash 函数智能的找到存放元素的位置
- 在 Go 语言中叫 Map
package main
func main()
dict := make(map[string]int)
dict1 := map[string]int"Apple": 3, "Orange": 4
- 其它语言中:Dictionary、Map、Hash Map......
使用场景
- 电话簿
- DNS 解析
- 缓存
冲突
- 冲突就是:两个 Key 被安排到了同一个位置
- 也就是说:K1 != K2,但 H(K1) == H(K2)
解决冲突
- 开放地址法、再 Hash 法、建立公共溢出区 ...
- 链地址法:链表
注意:
- Hash 函数应尽可能的将 Key 平均的映射
- 如果链表过长,会让 Hash Table 变得很慢
选择 Hash 函数
Hash Table 平均 | Hash Table 最坏 | 数组 | 链表 | |
---|---|---|---|---|
查找 | O(1) | O(n) | O(1) | O(n) |
避免冲突
- 装载因子(load factor)要低
- 一个好的 Hash 函数
装载因子(load factor)
- 调整大小,Resize
- 例如:load factor 为 75% 的时候,就可以调整大小,通常是原来大小的两倍
- 注意:调整大小也会花费很多时间
选择好的 Hash 函数
- 好的 Hash 函数会将值尽可能的平均分布在数组中
- 不好的 Hash 函数经常会把值聚集,并产生很多冲突
- 通常不需要自己编写 Hash 函数,可以了解 SHA 函数
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/p/17464792.html
golang进行加密
crc64加密
package main import ( "fmt" "hash/crc64" ) func main(){ s:="打死udhanckhdkja" //先创建一个table table := crc64.MakeTable(crc64.ECMA) //传入字节切片和table,返回一个uint64 fmt.Println(crc64.Checksum([]byte(s), table)) //4295263180068867775 }
md5加密
package main import ( "crypto/md5" "encoding/hex" "fmt" ) func main(){ //方法一: s:="udhanckhdkja" //返回字节切片,长度为16 res := md5.Sum([]byte(s)) //注意此时不可以使用string(res)来转化,会得到乱码 //要使用hex.EncodeToString,但是要传入切片 fmt.Println(hex.EncodeToString(res[:]))//538a7e42c664f84d1dba984976489311 //方法二: md5ctx := md5.New() md5ctx.Write([]byte(s)) res1 := md5.Sum(nil) fmt.Println(hex.EncodeToString(res1[:]))//d41d8cd98f00b204e9800998ecf8427e }
以上是关于数据结构 in Golang:Hash Tables(哈希表)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode781. Rabbits in Forest (Hash Table + Math)