当前位置: 首页 > news >正文

网站建设策划书网站发布与推广phpcms中英文网站模板

网站建设策划书网站发布与推广,phpcms中英文网站模板,南充住房和城乡建设厅网站,宜兴百度推广公司参考: 解剖Go语言map底层实现Go语言核心手册-3.字典 一、Go Map底层结构: Go map的底层实现是一个哈希表(数组 链表),使用拉链法消除哈希冲突,因此实现map的过程实际上就是实现哈希表的过程。 先来看下…

参考:

  • 解剖Go语言map底层实现
  • Go语言核心手册-3.字典

一、Go Map底层结构:

Go map的底层实现是一个哈希表数组 + 链表),使用拉链法消除哈希冲突,因此实现map的过程实际上就是实现哈希表的过程。

先来看下go map底层的具体结构:

type hmap struct {count      int            // 元素个数,调用len(map)返回这个值B          uint8          // bucket数量是2^B, 最多可以放 loadFactor * 2^B 个元素,再多就要扩容了hash0      uint32         // hash seedbuckets    unsafe.Pointer // 指向bucket数组的指针(存储key val);大小:2^B oldbuckets unsafe.Pointer // 扩容时,buckets 长度是 oldbuckets 的两倍// ...
}
type bmap struct {topbits  [8]uint8     // 高位哈希值数组keys     [8]keytype   // 存储key的数组values   [8]valuetype // 存储val的数组overflow uintptr      // 指向当前bucket的溢出桶// 为缓解当存在多个key计算后的哈希值低8位相同的个数大于一个bucket所能存放的数目8个时,且这个map还没达到扩容条件时,做的一种存储设计。
}

在这里插入图片描述
在这个哈希表中,主要涉及到的结构体有两个:一个是 hmap(a header for a go map),一个是 bmap(a bucket for a go map):

  • 对于 hmap,我们只需要关注其中的 buckets,它是一个指向 bmap结构体类型数组的指针。
    • 而对于其中的 bmap
      • 高位哈希值 topbits:数组记录的是当前bucket中key相关的 “索引”
      • 指向扩容bucket的指针 overflow:每个 bmap类型的 bucket 最多只能放 8个k-v键值对。如果碰巧有key的哈希值一样的新数据存入当前bucket,那就需要再构建一个新的溢出桶 bucket,并通过overflow指针连接起来,使得bucket形成一个链表结构。
      • 存储key/value的数组 keysvalues

二、key-value是如何存放的:

当前bucket桶中的 key-value 的值的存放是有其特点的,bucket桶中所有的key存放到 keys数组中,而所有的value存放到 values数组中。
这么做的原因也很简单,可以在key和value的长度不同时,消除padding(内存对齐)带来的空间浪费。具体如图所示:
在这里插入图片描述

三、根据key 查找/新增 数据:

对传来的key进行哈希运算得到唯一哈希值,并将该哈希值分为高位和低位,如图所示:
在这里插入图片描述
蓝色为高位,红色为低位。 低位用于寻找当前key属于哪个bucket,而高位用于寻找对应bucket中的具体key

而之前 bmap中的高位哈希值数组字段 topbits,存的就是当前bucket桶中不同key-value键值对中对应key的高位哈希值,这样便于根据key查找数据。

新增的过程与查找过程类似,也是填充桶的过程。

四、删除map中的数据

针对map中的key-value数据:

  • 如果是指针类型数据,则将其原有引用去除,利用go GC来清理内存
  • 如果是类型数据,则直接清理对应内存空间

最后将该key-value记录对应的 【bmap中高位哈希值数组 topbits】中的key相关 “索引” 置空。

五、map的扩容

当go map中每个bucket桶存储的平均元素个数大于加载因子 loadFactor = 6.5(判断扩容的条件)时,map底层就会创建一个容量大小是原来2倍的新buckets数组,并将 oldbuckets指针指向原来的旧buckets数组。然后,对旧buckets数组中的元素key重新哈希(rehash)得到新的哈希值,根据新的哈希值的高位和低位来放入扩容后的新buckets数组中。

加载因子越小↓,说明空间利用率低,因此 “产生冲突的机会” 低;
加载因子越大↑,说明空间利用率高,但是 “产生冲突的机会” 也高了。

不过需要注意的是:

并不是立刻把 oldbuckets指针所指向的旧bucket数组中的元素一次性转移到新的bucket数组当中,而是当只有访问到具体某个key所在的bucket时,才会将该bucket中的旧数据逐步迁移到新bucket中。一直到旧数据完全迁移完,才会删除 oldbuckets的指向,使得旧buckets空间得到释放。如下图所示:
在这里插入图片描述
这里迁移完并不会直接删除旧bucket中的数据,而是把原来旧数据的引用去掉,利用GC逐步清除内存

六、map的等量扩容(缩容)

map中数据较少,但 overflow 指向的溢出桶bucket数量过多时,会导致溢出桶中的记录存储很稀疏,排列不紧凑,大量空间被浪费。这时就需要进行等量扩容/缩容(一般出现在之前数据被大量删除的场景下)。

其实就是重新整理一下数据,使溢出桶中的数据重新紧凑的放在普通bucket桶中,避免不必要的空间浪费。

http://www.yayakq.cn/news/464402/

相关文章:

  • 国内免费设计素材网站最好的网站模板网站
  • 跨平台 移动网站开发德阳网站开发熊掌号
  • 织梦做中英文网站步骤自己做自己的私人网站
  • 满城区城乡建设局网站大朗网站建设
  • 找人做网站价格网络规划与设计方案
  • wordpress 增加站长统计建筑工程网络计划的关键工作有哪些
  • app下载网站建设丹阳网站建设哪家好
  • 古风网站的关于我们页面怎么做在线html编辑
  • 12306网站开发滇中引水工程建设管理局网站
  • 微信营销软件有哪些导航网站怎么做seo
  • 茂名公司网站设计团队海南科技网络有限公司
  • 网站设计思路北京小程序开发电话
  • 做地坪网站wordpress添加首页友情链接
  • 公司网站开通抖音推广运营公司
  • 网站页面怎么做的好看管理咨询公司注册
  • 简述电子商务网站建设方案网站集群建设价格
  • 个人博客网站开发的背景外国语学院英文网站建设
  • 自己网站怎么推广wordpress获取热门文章
  • 公司网站建设支出计入深圳网站制作公司在那
  • 郑州建设网站哪家好搜易网优化的效果如何
  • 私人找人做网站公关公司是做什么的
  • 山西住房与建设部网站如何做代刷网站
  • 摄影网站网址大全好网站求推荐
  • 做网站电信运营许可证南阳最新数据消息
  • 长沙企业网站建设案例下载百度手机助手
  • 西安网站开发外包禅城网站建设公司价格
  • 网站后台数据库备份怎么做物业网站建设方案
  • 凡科用模板做网站网站建设的预算
  • 违反建设投诉网站举报重庆网站建设制作
  • 东莞网站设计制作怎么在wordpress上设计网站