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最佳实践 > 李晨光 著 清华大学出版社出版 内 容 简 介在传统的异构网络环境中,运维人员往往利用各种复杂的监管工具来管理网络,由于缺乏一种集成安全运维平台 ...
随机推荐
- 022configparser模块
#配置模块 #创建import configparser config = configparser.ConfigParser() #添加config["DEFAULT"] ...
- windows下libevent的编译及使用
之前简单分析了libevent的源码,过了一段时间要用的时候发现完全忘记了..从头记录一下流程 1.编译 可以从github下载libevent的压缩包,解压后 修改以下三个文件,添加宏定义: 在以下 ...
- Windows环境双系统安装环境配置
(最惊喜的事情莫过于...在安装系统完成重新试图安装Docker时解决了关于HyperV的问题,结果提示Docker只能在Win10 Pro或者Enterprise环境下运行...我很坚强...可以按 ...
- Android(java)学习笔记207:Android下的属性动画(Property Animation)
1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...
- Intellij IDEA 开启自动保存功能
IntelljJ IDEA关于文件自动保存功能主要有两种方式: 切换到其他应用时保存变化(默认使能) 设置路径:Settings >> Apperance & Behavior & ...
- SQL rownum的用法
rownum只显示两行记录,第一行是字段名,第二行是满足查询条件的记录.
- hdu1579 Function Run Fun(深搜+记忆化)
版权声明:本文为博主原创文章.未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/37076755 转载请注明出处 ...
- PHP 生成全局唯一id
直接上代码: function generate_global_uniqid() { $prefix = md5(microtime(true)); // 生成唯一ID发生器 prefix,如果为服务 ...
- Sublime Text 3中关闭记住上次打开的文件
使用UltraEdit的时候,每次安装后就得修改一堆配置,其中一项便是关闭“打开上一次未关闭的文件”,Sublime Text 2也有这么一个默认的功能,在实际使用中,这种方式确实可以较快速的访问文件 ...
- 华为交换机SSH配置
设备:S5700 一.在本地设备服务端生成秘钥对 [Huawei]rsa local-key-pair create 二.配置VTY [Huawei]user-interface vty 0 4进入虚 ...