0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文了解go hashmap(数据结构、实现原理、读写操作)

454398 来源:itpub技术栈 作者:itpub技术栈 2020-09-30 16:19 次阅读

这是看着别人的文章结合源码来整理的自己一套理解

理解 Golang 哈希表 Map 的原理​draveness.me

通过数据结构、实现原理、读写操作来了解go hashmap

数据结构

hash有2个关键数据结构:hmapbmap

hmap:runtime/map.go

type hmap struct {
    count       int 
    flags       uint8
    B           uint8  
    noverflow   uint16 
    hash0       uint32 
    buckets     unsafe.Pointer 
    oldbuckets  unsafe.Pointer
    nevacuate   uintptr
    extra       *mapextra 
}

count元素数量

B2^B个buckets桶

noverflowbuckets溢出桶的数量,近似值

buckets桶

oldbuckets扩容时指向原buckets桶

bmap:runtime/map.gocmd/compile/internal/gc/reflect.go

type bmap struct {
    topbits     [8]uint8
    keys        [8]keytype
    elems       [8]elemtype
    pad         uintptr
    overflow    uintptr
}

哈希表中桶的真正结构其实是在编译期间运行的函数bmap中被『动态』创建的, 代码在cmd/compile/internal/gc/reflect.go

topbits存储hash值的高8位,通过比对高8位减少键值对访问次数以提高性能

keys/elems数组

pad内存对齐

overflow溢出桶,map存储数据过多时使用

实现原理

时间复杂度: O(1)

hash函数和hash冲突解决方法

hash函数

实现哈希表的关键点在于如何选择哈希函数,哈希函数的选择在很大程度上能够决定哈希表的读写性能,在理想情况下,哈希函数应该能够将不同键映射到不同的索引上,这要求哈希函数输出范围大于输入范围,但是由于键的数量会远远大于映射的范围,所以在实际使用时,这个理想的结果是不可能实现的。

hash冲突

开放寻址法:对数组中的元素依次比较键值对是否存在于数组

拉链法: 使用数组加上链表

读写操作

计算出key的hash

用最后的“B”位来确定在哪个桶(“B”就是前面说的那个,B为4,就有16个桶,0101用十进制表示为5,所以在5号桶)

根据key的前8位快速确定是在哪个格子(额外说明一下,在bmap中存放了每个key对应的tophash,是key的前8位)

最终还是需要比对key完整的hash是否匹配,如果匹配则获取对应value

如果都没有找到,就去下一个overflow找

通过key的后“B”位确定是哪一个桶

通过key的前8位快速确定是否已经存在

最终确定存放位置,如果8个格子已经满了,没地方放了,那么就重新创建一个bmap作为溢出桶连接在overflow

扩容

条件:

装载因子大于6.5

溢出桶 大于15个

func mapassign(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer {
    ...
    if !h.growing() && (overLoadFactor(h.count+1, h.B) || tooManyOverflowBuckets(h.noverflow, h.B)) {
        hashGrow(t, h)
        goto again
    }
    ...
}

方式:

等量扩容

翻倍扩容
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据结构
    +关注

    关注

    3

    文章

    560

    浏览量

    39898
  • 读写操作
    +关注

    关注

    0

    文章

    5

    浏览量

    7089
  • hashmap
    +关注

    关注

    0

    文章

    11

    浏览量

    2248
收藏 人收藏

    评论

    相关推荐

    什么是数据结构(Data Structrue)

    什么是数据结构(Data Structrue)  名词术语数据:描述客观事物的数字,字符以及切能够输入到计算机中,并且能够被计算机程序处理的符号的集合。
    发表于 02-09 17:17

    数据结构概述及线性表

    。    “数据结构”是计算机专业的门核心课程,是“编译原理”、“操作系统”、“数据库”等课程的基础,也是设计和实现
    发表于 12-05 21:20

    数据结构要学吗?

    经常看到很多高手说到堆栈队列这些数据结构的专业名词,可是我并不了解直觉得这是计算机专业的同学学的,做控制方面的有必要学吗?
    发表于 07-15 19:44

    数据结构

    1.数据结构的概念 所谓数据结构是指由某一数据对象及该对象中所有数据成员之间的关系组成的集合。成员之间的关系有很多种,最常见的是前后件关系。 2.
    发表于 03-04 14:13

    常见的数据结构

    顺序表结构的底层实现借助的就是数组,因此对于初学者来说,可以把顺序表完全等价为数组,但实则不是这样。数据结构是研究数据存储方式的门学科,它
    发表于 05-10 07:58

    C语言与数据结构

    目录个人介绍笔试单选题C语言数据结构计算机与操作系统网络通信填空题C语言与数据结构网络通信问答题嵌入式基础知识C语言与数据结构C编程面二面
    发表于 08-06 07:10

    数据结构链表的基本操作

    嵌入式学习基础-数据结构链表的基本操作链表节点采用结构体的方式进行定义,下面是最基础的定义只有数据data,*pNext用于指向下
    发表于 12-22 08:05

    数据结构是什么?数组为什么要有数组

    1、数据结构是什么数据结构就是研究数据如何组织(在内存中排布),如何加工的学问。2、最简单的数据结构:数组为什么要有数组?因为程序中有好多个类型相同、意义相关的变量需要管理,这时候如果
    发表于 01-07 08:08

    数据结构是什么_数据结构有什么用

    数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高
    发表于 11-17 14:45 1.6w次阅读
    <b class='flag-5'>数据结构</b>是什么_<b class='flag-5'>数据结构</b>有什么用

    什么是数据结构?为什么要学习数据结构数据结构的应用实例分析

    本文档的主要内容详细介绍的是什么是数据结构?为什么要学习数据结构数据结构的应用实例分析包括了:数据结构在串口通信当中的应用,数据结构在按键
    发表于 09-26 15:45 14次下载
    什么是<b class='flag-5'>数据结构</b>?为什么要学习<b class='flag-5'>数据结构</b>?<b class='flag-5'>数据结构</b>的应用实例分析

    什么是栈?数据结构中栈如何实现

    今天放松一下,我们来看看数据结构中的栈,这节的知识点可以说是数据结构中最容易上手的知识点了,其实比起链表,其实链表也有栈和队列的模型,链表的头插其实就是后进先出,链表的尾插其实就是先进先出,这不
    发表于 04-29 18:25 0次下载
    什么是栈?<b class='flag-5'>数据结构</b>中栈如何<b class='flag-5'>实现</b>

    算法和数据结构基础知识分享(上)

    有哪些常见的数据结构?基本操作是什么?常见的排序算法是如何实现的?各有什么优缺点?本文简要分享算法基础、常见的数据结构以及排序算法。
    的头像 发表于 04-06 16:48 577次阅读
    算法和<b class='flag-5'>数据结构</b>基础知识分享(上)

    算法和数据结构基础知识分享(中)

    有哪些常见的数据结构?基本操作是什么?常见的排序算法是如何实现的?各有什么优缺点?本文简要分享算法基础、常见的数据结构以及排序算法。
    的头像 发表于 04-06 16:48 385次阅读
    算法和<b class='flag-5'>数据结构</b>基础知识分享(中)

    算法和数据结构基础知识分享(下)

    有哪些常见的数据结构?基本操作是什么?常见的排序算法是如何实现的?各有什么优缺点?本文简要分享算法基础、常见的数据结构以及排序算法。
    的头像 发表于 04-06 16:48 545次阅读
    算法和<b class='flag-5'>数据结构</b>基础知识分享(下)

    redis数据结构的底层实现

    ,包括字符串、列表、哈希表、集合和有序集合。每种数据结构都有不同的底层实现,以满足对于不同操作的高效支持。 首先,我们来看Redis中最基本的数据结构——字符串。Redis的字符串是二
    的头像 发表于 12-05 10:14 307次阅读