首页 > 其他分享 >go语言hash表

go语言hash表

时间:2023-06-19 11:15:18浏览次数:27  
标签:map hash 语言 房间 SHA m0 哈希 go

map特性

长度可变;存储的元素是key-value对(键值对),value可变 key无序不重复 不可索引,需要通过key来访问;不支持零值可用,也就是说,必须要用make或字面常量构造;引用类型; 哈希表

哈希算法

哈希Hash算法特征

y = hash(x),给定一个x一定得到一个y值

x的范围是输入空间,输入可以是任意长度;y的范围是输出空间,输出是固定长度

hash函数一般设计的计算效率很高

由于输入空间(可以理解为取值范围)远远大于输出空间,有可能不同的x经过hash得到同样的y, 这称为碰撞,也称冲突

不同的x计算出的y值应当在输出空间中分布均匀,减少碰撞

不能由y反推出x,hash算法不可逆

x一个微小的变化,哪怕是一个bit位的变化,也将引起结果y巨大的变化

常见算法

SHA(Secure Hash Algorithm)安全散列算法,包含一个系列算法,分别是SHA-1、SHA-224、 SHA-256、SHA-384,和SHA-512。 用于数字签名防篡改。

MD5(Message Digest Algorithm 5)信息摘要算法5,输出是128位。运算速度比SHA-1快;用于用户密码存储,上传、下载文件完整性校验,大的数据的快速比对,例如字段很大,增加一个字段存储该字段的hash值,对比内容是否修改。

package main
import (
 "crypto/sha256"
 "fmt"
)
func main() {
 // https://pkg.go.dev/crypto/sha256#example-New
 h := sha256.New()
 h.Write([]byte("abc")) // 提供字节流
 r := h.Sum(nil)
 s := fmt.Sprintf("%x", r) // 把字节序列d的每个字节以16进制显示
 fmt.Printf("%T %s %d\n", r, s, len(s))
}

 内存模型

map采用哈希表实现。Go的map类型也是引用类型,有一个标头值hmap,指向一个底层的哈希表。

哈希表Hash Table

简单理解公式为 y = hash(x) 开辟一块内存空间,分割出一个个“房间”,这个房间称为bucket桶,按照y值为“房间”编号 使用给出的x计算出对应的y值,可以按照某种关系计算出数据将被存储到的“房间号码”,将数据存入该房间, 即使是hash函数设计的好,数据分布均匀,但是存储的数据很多,超过负载因子,则需要扩容, 否则再加入数据后,冲突太多,引起效率低下

理解的hash函数原理,可以用除留余数法来思考,即hash(x) = key mod p。p是hash表大小,看做房间 个数。

hash(x0) => Roomk,计算出一个确定的房间号码。

hash冲突

房间有人占了,就重新找个空房间让客人住,这是开放地址法

房间有人占了,就挤在同一个房间内,将值用链表存储在一起,这是链地址法,也称拉链法

Go 语言采用拉链法,但做了一定的优化

创建map

    var m0 map[string]int // 这里只是声明m0,0值不可用
    fmt.Println(m0, len(m0))
    // 下面会panic:assignment to entry in nil map
    m0["who"] = 111 // 由于m0是nil,所以空map不可以使用
// 1 字面量
var m0 = map[string]int{} // 安全,没有一个键值对而已
var m1 = map[string]int{
 "a": 11,
 "b": 22,
 "c": 33, // Go要求这里以逗号结尾
}
// 2 make
m2 := make(map[int]string) // 一个较小的起始空间大小
m2[100] = "abc"
m3 := make(map[int]string, 100) // 分配足够容量来容纳100个元素,长度为0。为了减少扩
容,可以提前给出元素个数

 map的CRUD

查找的时间复杂度为O(1),由于map的特殊构造,不能使用cap。

 

标签:map,hash,语言,房间,SHA,m0,哈希,go
From: https://www.cnblogs.com/caibao666/p/17490473.html

相关文章

  • Rstudio如何做python语言的编辑器?
    参考文档:https://support.posit.co/hc/en-us/articles/1500007929061-Using-Python-with-the-RStudio-IDE1、Rstudio中globalstudio中globaloptions配置pythoninterpreter----地址:C:/Users/18308/anaconda3/python.exe2、安装包:install.packages("reticulate")3、library(re......
  • MongoDB常用28条查询语句
    MongoDB常用28条查询语句1查询所有记录db.userInfo.find();相当于:select*fromuserInfo;默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”,但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize=50;......
  • 一文读懂ChatGPT的工作原理:大语言模型是个啥?它到底咋工作的?
    继AI绘画后,ChatGPT横空出世。聊天、翻译、文案、代码……ChatGPT的功能如此强大,以至于连马斯克都认为“我们离强大到危险的AI不远了。”在感慨ChatGPT如此强大的同时,人们也开始对ChatGPT的工作原理产生了好奇:ChatGPT是什么?它到底是如何运行的?怎样才能丝滑地与它对话呢?想要了解Ch......
  • 深入理解Go语言接口
    1.引言接口是一种定义了软件组件之间交互规范的重要概念,其促进了代码的解耦、模块化和可扩展性,提供了多态性和抽象的能力,简化了依赖管理和替换,方便进行单元测试和集成测试。这些特性使得接口成为构建可靠、可维护和可扩展的软件系统的关键工具之一。在现代编程语言中,接口是不可......
  • 【技术积累】自然语言处理中的基础知识【一】
    什么是自然语言处理(NLP)自然语言处理(NaturalLanguageProcessing,NLP)是计算机科学和人工智能领域中的一个重要分支。它研究如何让计算机去理解、处理和生成自然语言,使计算机能够像人一样读、写、听和说自然语言。NLP主要涉及文本处理、语音识别、文本生成等技术。它主要通过利......
  • 自然语言处理 Paddle NLP - 快递单信息抽取 (ERNIE 1.0)
    文档检索:需要把业务问题拆解成子任务。文本分类->文本匹配->等任务->PanddleAPI完成子任务->子任务再拼起来介绍在2017年之前,工业界和学术界对文本处理依赖于序列模型RecurrentNeuralNetwork(RNN).图1:RNN示意图基于BiGRU+CRF的快递单信息抽取项目介绍了如何使......
  • maltego的 卡 慢 没反应 的问题解决方法
    maltego的卡慢没反应的问题主要是因为它要在国外下载和认证一些东西,导致软件无法正常访问。解决方法:配置带理,软件内部就支持,打开选择设置,    选择手动指定,填入服务器ip和端口,我使用链接本地服务器带理,服务器要允许局域网连接,并且关闭服务器上的防火墙,如果......
  • QGeoPolygon
    QGeoPolygon#include<QGeoPolygon> PublicFunctions QGeoPolygon() QGeoPolygon(constQList<QGeoCoordinate>&path) QGeoPolygon(constQGeoPolygon&other) QGeoPolygon(constQGeoShape&other) ~QGeoPolygon()voi......
  • Go 语言之 Shutdown 关机和fvbock/endless 重启
    Go语言之Shutdown关机和fvbock/endless重启Shutdown源码//Shutdowngracefullyshutsdowntheserverwithoutinterruptingany//activeconnections.Shutdownworksbyfirstclosingallopen//listeners,thenclosingallidleconnections,andthenwaiting......
  • 2023跟我一起学设计模式:Golang 抽象工厂模式讲解和代码示例
    Golang抽象工厂模式讲解和代码示例抽象工厂是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。抽象工厂定义了用于创建不同产品的接口,但将实际的创建工作留给了具体工厂类。每个工厂类型都对应一个特定的产品变体。在创建产品时,客户端代码调用的是工厂对象的......