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最佳实践 > 李晨光 著 清华大学出版社出版 内 容 简 介在传统的异构网络环境中,运维人员往往利用各种复杂的监管工具来管理网络,由于缺乏一种集成安全运维平台 ...
随机推荐
- linux shell每天一阅 -- 安装nginx以及apache
当然这个博客原代码是转载大神的... 自动安装Nginx脚本,采用case方式,选择方式,也可以根据实际需求改成自己想要的脚本mynginx.sh #!/bin/sh ###nginx install ...
- [EffectiveC++]item36:绝不重新定义继承而来的non-virtual函数
- Promise里捕捉错误的最佳实践
Promise里的同步部分不需要try catch new Promise((resolve, reject) => { throw new Error('error'); setTimeout ...
- Chosen三级联动
上一篇介绍了 Chosen 的使用,这篇介绍联动.看代码: var addressResolve = function (options) { //检测用户传进来的参数是否合法 if (!isVal ...
- mybatics之trim
1.<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=&quo ...
- HDU 2897 邂逅明下 ( bash 博弈变形
HDU 2897 邂逅明下 ( bash 博弈变形 题目大意 有三个数字n,p,q,表示一堆硬币一共有n枚,从这个硬币堆里取硬币,一次最少取p枚,最多q枚,如果剩下少于p枚就要一次取完.两人轮流取,直 ...
- HDU 1012 u Calculate e(简单阶乘计算)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1012 u Calculate e Time Limit: 2000/1000 MS (Java/Oth ...
- sharepoint2016安装OOS,OOS场负载均衡
Office Online Server is the successor to Office Web Apps Server. It may be connected to SharePoint, ...
- 搭建Hadoop2.6.0+Spark1.1.0集群环境
前几篇文章主要介绍了单机模式的hadoop和spark的安装和配置,方便开发和调试.本文主要介绍,真正集群环境下hadoop和spark的安装和使用. 1. 环境准备 集群有三台机器: master: ...
- Spring入门第二课:Spring配置Bean的细节
1.配置bean的作用域: 通过配置scope属性可以bean的作用域,参数有 prototype.request.session.singleton. 1)singleton为单例,IoC容器只会创 ...