golang 多维哈希(map,hashmap)实践随笔
有些场景使用多维哈希来存储数据,时间复杂度恒定,简单粗暴好用。这里记录一下。
如下是三维哈希的简单示意图,建议层数不要太多,否则时间久了,自己写的代码都不认识。

下图是三维哈希在内存的存储形式,hashmap嵌套了3层。图里一层数组存放entry和链表next指针,每个节点里面都存放一个数组,数组存放下一层hashcode和下一层链表指针。(没有将哈希分桶链表完整画出来,本图重点是哈希嵌套)

这个数据结构我是用来解析保存不同设备的配置,每个设备有两个配置文件。当新来一个该设备的数据(base64加密后的json序列化字符串),通过这个三维哈希层层解析,返回给用户直观的表象。这里不谈业务,只谈如何暴力存,暴力解。
/*****************************************************************************
结 构 名 : StringStu
功能描述 : 设备string文件数据结构
*****************************************************************************/
type StringStu struct {
Cat_name string `json:"cat_name,omitempty"`
Dev_name string `json:"dev_name,omitempty"`
Pid string `json:"pid,omitempty"`
Error interface{} `json:"error,omitempty"`
Intfs interface{} `json:"intfs,omitempty"`
Vendor_name string `json:"vendor_name,omitempty"`
} /*****************************************************************************
结 构 名 : 产品string文件相关处理
功能描述 :
*****************************************************************************/
func GetAllProductString() (Slice []ProfileSuidsStu) {
StringStu := ReadStringFile()
for _, StringOne := range StringStu {
LoadDevStrings2Cache(StringOne.Pid, libf.StructToJsonStringOne(StringOne.Intfs))
}
return
} func ReadStringFile() []StringStu {
var file string = ""
var StringSlice = make([]StringStu, 0)
file = libf.KeyfileT(file).GetFileName("strings.json") Byte, Error := ioutil.ReadFile(file)
if Error != nil {
prnLog.LogPrint(libf.LOG_ERROR, 0, false, false, "", "ReadFile error", Error)
return nil
} msg, ret := libf.ParseJsonByStructMsg(Byte, &StringSlice)
return StringSlice
} /*****************************************************************************
结 构 名 : StringIntfsStu
功能描述 : 设备string文件,设备Intfs属性
*****************************************************************************/
type StringsIntfsStu struct {
Name string `json:"name,omitempty"` //字段的中文名称,例如:电量,背景灯光
Unit string `json:"unit,omitempty"` //单元,例如温度°C
Values map[string]string `json:"values,omitempty"` //字段值对应的中文枚举,例如:0是关,1是开
} type ParamAttr = map[string]StringsIntfsStu var ProductStrings = make(map[string](ParamAttr), 0) /*****************************************************************************
* \author pxx
* \date 2018/08/25
* \brief 将所有设备的strings配置,载入一个三维哈希中。
一维哈希是ProductStrings,key为pid,
二维哈希是ParamAttr,key为字段英文名称,
三维哈希是StringIntfsStu结构体内的Values,key为字段的值
* \param[in]
* \param[out]
* \return
* \ingroup
* \remarks
******************************************************************************/
func LoadDevStrings2Cache(pid, String string) {
var (
keyListString map[string]interface{} = make(map[string]interface{}, 0)
_param_attr = make(ParamAttr, 0)
)
ProductStrings[pid] = _param_attr
msg, ret := libf.ParseJsonByStructMsg([]byte(String), &keyListString)
for key, value := range keyListString {
var string1 StringsIntfsStu //注意作用域 msg, ret = libf.ParseJsonByStructMsg([]byte(libf.StructToJsonStringOne(value)), &string1)
if ret != libf.Success {
prnLog.LogPrint(libf.LOG_DEBUG, 0, false, false, "msg=%v,ret=%v", msg, ret)
continue
}
_param_attr[key] = string1
}
}
上面的代码是粗暴的将所有设备的配置文件存入内存,下面则是根据这个三维哈希去解析数据。
/*****************************************************************************
* \author pxx
* \date 2018/08/27
* \brief 将json序列化的无结构数据,映射为结构化数据
* \param[in]
* \param[out]
* \return
* \ingroup
* \remarks 开源代码说明:https://www.jb51.net/article/73996.htm
******************************************************************************/
func FormatUploadData(StringData string) (StructData StructUploadDataStu) {
StructData.Did = gojson.Json(StringData).Get("did").Tostring()
StructData.Pid = gojson.Json(StringData).Get("pid").Tostring() for k, v := range ProductProfile[StructData.Pid] { //k是字段名称,v是这个字段的子属性
value := gojson.Json(StringData).Get(k).Tostring() //根据设备每个字段的不同属性,来映射对应的中文名称,枚举值,字符串值还有整数值
switch v.In[0] {
case 1, 3: //1表示枚举,2表示是连续型的参数,3 string
StructData.Data += ProductStrings[StructData.Pid][k].Name + ":" + ProductStrings[StructData.Pid][k].Values[value] + ", " case 2:
StructData.Data += ProductStrings[StructData.Pid][k].Name + ":" + value + ", " default: }
}
return
}
golang 多维哈希(map,hashmap)实践随笔的更多相关文章
- 记一次坑爹的golang 二维map判断问题
记一次坑爹的golang 二维map判断问题 2018年10月18日 23:16:21 yinnnnnnn 阅读数:32更多 个人分类: golang 版权声明:本文为博主原创文章,未经博主允许不 ...
- Atitit.二维码功能的设计实践 attilax 总结
Atitit.二维码功能的设计实践 attilax 总结 1.1. 二维码要实现的功能1 1.2. 现有二维码功能设计不足的地方(待改进)1 1.3. 二维码组件1 1.4. Java版 zxing ...
- Golang在视频直播平台的高性能实践
http://toutiao.com/i6256894054273909249/ 熊猫 TV 是一家视频直播平台,先介绍下我们系统运行的环境,下面这 6 大服务只是我们几十个服务中的一部分,由于并发量 ...
- URAL - 1486 Equal Squares 二维哈希+二分
During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued about who o ...
- 【URAL 1486】Equal Squares(二维哈希+二分)
Description During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued ...
- Map随笔:最常用的Map——HashMap
目录 Map随笔:最常用的Map--HashMap 前言: 1,HashMap的结构 2,HashMap的一些属性(JDK8) 3,HashMap的构造函数(JDK8) 4,HashMap的一些方法( ...
- Golang的一致性哈希实现
Golang的一致性哈希实现 一致性哈希的具体介绍,可以参考:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html 1 imp ...
- Collections+Iterator 接口 | Map+HashMap+HashTable+TreeMap |
Collections+Iterator 接口 1. Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了大量方法对集合元素进行排序.查询 ...
- 《开源安全运维平台:OSSIM最佳实践》内容简介
<开源安全运维平台:OSSIM最佳实践 > 李晨光 著 清华大学出版社出版 内 容 简 介在传统的异构网络环境中,运维人员往往利用各种复杂的监管工具来管理网络,由于缺乏一种集成安全运维平台 ...
随机推荐
- HDU ACM 2895-Edit distance
Edit distance Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- redis外网连接的一些坑
前言 在使用阿里云和腾讯云的redis 可以减少很大的维护量.但是在我们的业务场景中遇到了一个情况,阿里和腾讯的redis均不支持外网访问.因此,正好帮人解决一个问题,就拿出来分享一下. 阿呆的故事 ...
- 一个较复杂的执行redis的lue脚本
- July 06th 2017 Week 27th Thursday
Knowledge is the antidote to fear. 知识可以解除恐惧. Fear always steps from unknown things. Once we know wha ...
- python数据结构(整理)
http://www.cnblogs.com/yupeng/p/3413763.html 1. 单链表 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点 ...
- PHP 获取数组随意下标key的上一个prev和下一个next下标值
PHP 获取数组随意下标key的上一个prev和下一个next下标值 <? php $xoops[1] = '小'; $xoops[2] = '孩'; $xoops[3] = '子'; $xoo ...
- wampserver 最新版本 mysql修改数据库密码
由于wampsever版本更新就导致以前版本的密码修改造成失败,主要是密码字段改变造成的! 第一步 进入MySQL 控制台 wamp安装,数据库是没有密码 进入控制台直接回车就可以了 第二步 使用 ...
- appium入门知识
UI自动化相关工具 1.appium平台 2.Apple的UIAutomation 3.Google的UIAutomation 简单的介绍一下这几个工具: 1.Appium简介 Appium使用Web ...
- [转] 各种Json解析工具比较 - json-lib/Jackson/Gson/FastJson
JSON技术的调研报告 一 .各个JSON技术的简介和优劣1.json-libjson-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括com ...
- POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)
传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K T ...