go实现并发安全hashtable 拉链法

在这个实现中,HashTable包含多个bucket,每个bucket都有一个互斥锁来保证并发安全。Put方法用于插入键值对,Get方法用于获取值,Delete方法用于删除键值对。通过哈希函数确定键应该存储在哪个bucket中,然后在对应的bucket中进行操作。这种实现方式可以有效地处理并发访问,确保哈希表在多线程环境下的正确性。

go 复制代码
package main

import (
    "sync"
)

type HashTable struct {
    buckets    []*bucket
    bucketSize int
}

type bucket struct {
    mu     sync.Mutex
    items  map[string]interface{}
}

func NewHashTable(bucketSize int) *HashTable {
    buckets := make([]*bucket, bucketSize)
    for i := range buckets {
        buckets[i] = &bucket{
            items: make(map[string]interface{}),
        }
    }
    return &HashTable{
        buckets:    buckets,
        bucketSize: bucketSize,
    }
}

func (ht *HashTable) hash(key string) int {
    hashValue := 0
    for _, char := range key {
        hashValue += int(char)
    }
    return hashValue % ht.bucketSize
}

func (ht *HashTable) Put(key string, value interface{}) {
    bucketIndex := ht.hash(key)
    bucket := ht.buckets[bucketIndex]
    bucket.mu.Lock()
    bucket.items[key] = value
    bucket.mu.Unlock()
}

func (ht *HashTable) Get(key string) (interface{}, bool) {
    bucketIndex := ht.hash(key)
    bucket := ht.buckets[bucketIndex]
    bucket.mu.Lock()
    value, ok := bucket.items[key]
    bucket.mu.Unlock()
    return value, ok
}

func (ht *HashTable) Delete(key string) {
    bucketIndex := ht.hash(key)
    bucket := ht.buckets[bucketIndex]
    bucket.mu.Lock()
    delete(bucket.items, key)
    bucket.mu.Unlock()
}



func main() {
    ht := NewHashTable(10)

    // 并发安全地插入数据
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            ht.Put(fmt.Sprintf("key%d", i), i)
        }(i)
    }
    wg.Wait()

    // 并发安全地读取数据
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            value, ok := ht.Get(fmt.Sprintf("key%d", i))
            if ok {
                fmt.Println(value)
            }
        }(i)
    }
    wg.Wait()

    // 并发安全地删除数据
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            ht.Delete(fmt.Sprintf("key%d", i))
        }(i)
    }
    wg.Wait()
}
相关推荐
mqiqe11 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
gugucoding11 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g12 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__12 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
依然鸣12 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
byxdaz13 小时前
QT中服务使用
开发语言·qt
库玛西14 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
caimouse15 小时前
ReactOS 图形系统分析(19):颜色转换对象 — XLATEOBJ(xlateobj.c/h)
c语言·开发语言
liulilittle15 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
朋克洛德的码农15 小时前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang