首页 > 其他分享 >golang hashmap

golang hashmap

时间:2023-05-06 23:23:43浏览次数:33  
标签:node hash hashmap nil next golang key return

package main

import (
    "fmt"
)

const HASH_BUCKET_SIZE = 3 //1023

type hash_node struct {
    key  interface{}
    val  interface{}
    next *hash_node
}

//hash bucket to save node address
var hash_bucket [HASH_BUCKET_SIZE]*hash_node

func hash(key interface{}) int {
    hash := 5381
    switch x := key.(type) {
    case string:
        // Time 33 hash
        for _, k := range x {
            hash += (hash << 5) + int(k)
        }

        return (hash % HASH_BUCKET_SIZE)

    case int:

        hash += (hash << 5) + x

        return (hash % HASH_BUCKET_SIZE)
    default:

        _ = x
        return 0
    }
}

//insert new node addr in the head of linklist func hash_insert(node *hash_node) { hash := hash(node.key) head := hash_bucket[hash] node.next = head hash_bucket[hash] = node } func key_cmp(a interface{}, b interface{}) bool { typ := fmt.Sprintf("%T", a) switch x := b.(type) { case string: if typ == "string" { if b == a { return true } } case int: if typ == "int" { if b == a { return true } } default: _ = x return false } return false } func hash_del(item *hash_node) bool { hash := hash(item.key) cur := hash_bucket[hash] if cur == nil { return false } if key_cmp(cur.key, item.key) { hash_bucket[hash] = cur.next return true } for node := cur.next; node != nil; node = node.next { if key_cmp(node.key, item.key) { cur.next = node.next return true } cur = node } return false } func hash_iterate() { for i := 0; i < HASH_BUCKET_SIZE; i++ { fmt.Printf("i %d ----------> \n", i) for node := hash_bucket[i]; node != nil; node = node.next { fmt.Println(node.key, node.val) } } } func hash_get(key interface{}) interface{} { hash := hash(key) for node := hash_bucket[hash]; node != nil; node = node.next { if key_cmp(node.key, key) { return node.val } } return nil } func main() { for i := 0; i < 5; i++ { hash_insert(&hash_node{i, i + 1, nil}) hash_insert(&hash_node{fmt.Sprintf("key%d", i), fmt.Sprintf("val%d", i+1), nil}) } hash_iterate() fmt.Println("---------------after del------------") hash_del(&hash_node{"key4", nil, nil}) hash_del(&hash_node{2, nil, nil}) hash_iterate() fmt.Println(hash_get(4)) }

 output :

i 0 ---------->  

key3 val4

3 4

key0 val1

0 1

i 1 ---------->  

key4 val5

4 5

key1 val2

1 2

i 2 ---------->  

key2 val3

2 3

---------------after del------------

i 0 ---------->  

key3 val4

3 4

key0 val1

0 1

i 1 ---------->  

4 5

key1 val2

1 2

i 2 ---------->  

key2 val3

5

标签:node,hash,hashmap,nil,next,golang,key,return
From: https://www.cnblogs.com/wallywl/p/17378688.html

相关文章

  • HashMap设置初始容量一直都用错了?
    1背景今天在代码审查的时候,发现一位离职的同事留下了这样一串代码:Map<String,String>map=newHashMap<>((int)(list.size()/0.75F+1));第一反应是:又在炫技,又在搞这些花里胡哨的东西。但是看到0.75的我却陷入了沉思,稍微深入了解过Map的应该都知道,Map中有个属性,叫做负载因......
  • golang模拟键盘输入字符串
    介绍仅供学习使用哈,不要用来开gua。代码仓库:https://github.com/GuoFlight/gkeybd(本人仓库,欢迎留言)注意事项只支持英文使用前请切换到英文输入法。因为本程序只支持英文(模拟的是按键,而不是传递字符串)。Mac中使用可能会报错需要用vendor,并将vendor/github.com/micmona......
  • golang基础--Goroutine与Channel
    什么是goroutine?goroutine是go特有的并发体,是一种轻量级的线程,由go关键字启动。goroutine是Go语言提供的一种用户态线程,有时我们也称之为协程。所谓的协程,某种程度上也可以叫做轻量线程,它不由os,而由应用程序创建和管理,因此使用开销较低(一般为4K)。我们可以创建很多的gorou......
  • 简单说说HashMap和LinkedHashMap的区别
    HashMap和LinkedHashMap的区别我们知道HashMap的变量顺序是不可预测的,这意味着便利的输出顺序并不一定和HashMap的插入顺序是一致的。这个特性通常会对我们的工作造成一定的困扰。为了实现这个功能,我们可以使用LinkedHashMap。LinkedHashMap详解先看下LinkedHashMap的定义:pu......
  • Hashtable、synchronizedMap、ConcurrentHashMap 深度比较
    关键字:Hashtable、synchronizedMap、ConcurrentHashMap深度比较util.concurrent包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型List和Map的高性能的、线程安全的实现。BrianGoetz向您展示了用ConcurrentHashMap替换Hashtable或synchro......
  • 常用的截取字符串方法JS和Golang实现
    JS中截取字符串很简单,直接使用substr函数substr()方法可在字符串中截取从开始下标开始的指定数目的字符。下标是从0开始算例如:"21".substr(0,1)  返回2golang实现的substr//截取字符串,支持多字节字符//start:起始下标,负数从从尾部开始,最后一个为-1//length:截取长度,......
  • golang控制语句和运算符
    一、go程序基础1、文件名go语言文件名命名规范:go语言的文件名必须以.go结尾。go语言的文件名必须以小写字母开头,否则会报错。go语言的文件名不能包含空格,否则会报错。go语言的文件名不能包含特殊字符,否则会报错。go语言的文件名不能包含中文,否则会报错。go语言的文件名不......
  • 从源码深入理解读写锁(golang-RWMutex)
    环境:go1.19.8在读多写少的情况下,即使一段时间内没有写操作,大量并发的读访问也不得不在Mutex的保护下变成串行访问,这种情况下,使用Mutex,对性能影响比较大。所以就要区分读写操作。如果某个读操作的g持有了锁,其他读操作的g就不必等待了,可以并发的访问共享变量,这样就可以将串行的......
  • 简单聊聊,HashMap、HashTable、ConcurrentHashMap 之间的区别
    一、直观上的区别HashTable和HashMap都是用于存储键值对的数据结构我们一般把搜索的数据称之为关键字(key),与关键字key对应的为值(value),这种模型统称为“key-value的键值对”。Map和Table采用的都是key-Value模型,例如:有一个字符串,统计其中每个字符出现的次数,......
  • golang基础知识
    一golang基础知识Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种计算机编程语言语言。设计初衷Go语言是谷歌推出的一种的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(RobPike)说:我们之所以开发......