有些场景使用多维哈希来存储数据,时间复杂度恒定,简单粗暴好用。这里记录一下。

  如下是三维哈希的简单示意图,建议层数不要太多,否则时间久了,自己写的代码都不认识。

下图是三维哈希在内存的存储形式,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)实践随笔的更多相关文章

  1. 记一次坑爹的golang 二维map判断问题

    记一次坑爹的golang 二维map判断问题 2018年10月18日 23:16:21 yinnnnnnn 阅读数:32更多 个人分类: golang   版权声明:本文为博主原创文章,未经博主允许不 ...

  2. Atitit.二维码功能的设计实践 attilax 总结

    Atitit.二维码功能的设计实践 attilax 总结 1.1. 二维码要实现的功能1 1.2. 现有二维码功能设计不足的地方(待改进)1 1.3. 二维码组件1 1.4. Java版  zxing ...

  3. Golang在视频直播平台的高性能实践

    http://toutiao.com/i6256894054273909249/ 熊猫 TV 是一家视频直播平台,先介绍下我们系统运行的环境,下面这 6 大服务只是我们几十个服务中的一部分,由于并发量 ...

  4. URAL - 1486 Equal Squares 二维哈希+二分

    During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued about who o ...

  5. 【URAL 1486】Equal Squares(二维哈希+二分)

    Description During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued ...

  6. Map随笔:最常用的Map——HashMap

    目录 Map随笔:最常用的Map--HashMap 前言: 1,HashMap的结构 2,HashMap的一些属性(JDK8) 3,HashMap的构造函数(JDK8) 4,HashMap的一些方法( ...

  7. Golang的一致性哈希实现

    Golang的一致性哈希实现 一致性哈希的具体介绍,可以参考:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html   1 imp ...

  8. Collections+Iterator 接口 | Map+HashMap+HashTable+TreeMap |

    Collections+Iterator 接口 1. Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了大量方法对集合元素进行排序.查询 ...

  9. 《开源安全运维平台:OSSIM最佳实践》内容简介

    <开源安全运维平台:OSSIM最佳实践 > 李晨光 著 清华大学出版社出版 内 容 简 介在传统的异构网络环境中,运维人员往往利用各种复杂的监管工具来管理网络,由于缺乏一种集成安全运维平台 ...

随机推荐

  1. July 15th 2017 Week 28th Saturday

    If I can't hear your heartbeat, you are too far away. 如果我听不见你的心跳,那是因为你离我太远了. Only when the two tight ...

  2. 三、基于任务的异步模式(TAP),推荐使用

    一.引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用AP ...

  3. SAP CRM系统订单模型的设计与实现

    SAP成都研究院的一个部门领导让我给他的团队做一个SAP CRM One Order框架的培训,这是我准备的培训内容. 在Jerry之前的文章 基于SAP Kyma的订单编排增强介绍,我表达了自己对S ...

  4. web 应用程序转化为多租户 SaaS 解决方案

    web 应用程序转化为多租户 SaaS 解决方案 https://www.ibm.com/developerworks/cn/cloud/library/cl-multitenantsaas/inde ...

  5. AlexNet 分类 FashionMNIST

    from mxnet import gluon,init,nd,autograd from mxnet.gluon import data as gdata,nn from mxnet.gluon i ...

  6. 在.Net项目中使用Redis作为缓存服务

    转自:http://www.cnblogs.com/hohoa/p/5771255.html 最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写 ...

  7. luogu P1462 通往奥格瑞玛的道路

    嘟嘟嘟 这道题的题面相当的迷,我看了半天都没懂.最后看了题解的解释才懂. 他是这么个意思:对于所有能活着走到终点的路径,输出每一条路径中过路费最多的城市的最小值. 那么自然想到二分过路费,然后用dij ...

  8. 关于SQL注入中编码问题的疑问

    提到SQL注入的绕过,编码是其中最普通的一种方法,最常用的URL编码.之前一直有个疑问,编码与未编码到底有哪些地方存在区别? 以下是本人自己对URL编码的一些见解,可能有错误的地方欢迎大佬们指正. 什 ...

  9. [改错_19/04/01] 学习Java.IO 对象数据流时出现 Exception in thread "main" java.io.EOFException ...at cn.sxt.test.Test_DataStream.main(Test_DataStream.java:31) 错误 .

    过程描述:编译可以通过,就是每次运行时出现如下的图片,百思不得其解. 错误原因: byte[] datas=baos.toByteArray(); 放在了oos.writeInt(14);oos.fl ...

  10. java中StringBuffer与String、StringBuilder的区别

    在java中我们经常可以看到StringBuffer和String的用法,但是我自己在使用过程中,经常会将两者弄混淆,今天我们就来了解一下两者的区别: 我们首先来看一下我们的官方API中的简单介绍: ...