ZBLOG

package main import ( "crypto/sha256" "fmt" "sort" ) const ( BucketSize = 3 // 每个 bucket 的最大容量 IdSize = 20 // ID 的大小,字节数 MaxPeers = 100 ) type Node struct { id [IdSize]byte // 节点的 ID,长度为 IdSize

package main

import (

"crypto/sha256"
"fmt"
"sort"

)

const (

BucketSize = 3  // 每个 bucket 的最大容量
IdSize     = 32 // ID 的大小,字节数(改为了32)
MaxPeers   = 100

)

type Node struct {

id    [IdSize]byte        // 节点的 ID,长度为 IdSize
data  string              // 节点存储的数据
dht   map[[32]byte][]byte // DHT 结构体,保存键值对(修改为 [32]byte 类型)
peers []*Peer             // 保存其他节点信息(Peer对象)

}

type Peer struct {

dht *Node

}

type Bucket struct {

nodes []Node // 节点列表

}

type KBucket struct {

buckets  [IdSize * 8]*Bucket // K-Bucket 中存放 bucket 的数组
selfId   [IdSize]byte        // 自身节点的 ID
maxNodes int                 // 每个 bucket 的最大节点数量

}

func NewPeer(dht *Node) *Peer {

return &Peer{
	dht: dht,
}

}

func NewNode() *Node {

node := &Node{
	dht:   make(map[[32]byte][]byte),
	peers: make([]*Peer, 0, MaxPeers),
}
for i := 0; i < MaxPeers; i++ {
	node.peers = append(node.peers, NewPeer(node))
}
return node

}

func (p *Peer) SetValue(key, value []byte) bool {

hash := sha256.Sum256(value)
if hash != key { // 修改了判断条件,使用 hash 和 key 进行比较
	return false
}
p.dht[hash] = value // 修改为使用 hash 作为键进行存储
return true

}

func (p *Peer) GetValue(key [32]byte) []byte {

value, ok := p.dht[key]
if ok {
	return value
}
return nil

}

func NewBucket() *Bucket {

return &Bucket{
	nodes: make([]Node, 0, BucketSize), // 初始化节点列表,容量为 BUCKET_SIZE
}

}

// … 省略其他未修改的函数 …

func xor(a, b [IdSize]byte) [IdSize]byte {

var result [IdSize]byte
for i := 0; i < IdSize; i++ {
	result[i] = a[i] ^ b[i]
}
return result

}

func compare(a, b [IdSize]byte) int {

for i := 0; i < IdSize; i++ {
	if a[i] > b[i] {
		return 1
	} else if a[i] < b[i] {
		return -1
	}
}
return 0

}

func (kb *KBucket) getClosestPeers(targetId [IdSize]byte, numPeers int) []*Peer {

// 获取距离目标 ID 最近的 numPeers 个节点
type peerDistance struct { // 使用结构体代替匿名结构体,方便后续代码阅读和扩展字段
    peer     *Peer 
    distance [IdSize]byte 
}
peerDistances := make([]peerDistance, 0, len(kb.peers))

for _, peer := range kb.peers {
    distance := xor(peer.dht.id, targetId)
	peerDistances = append(peerDistances, peerDistance{
		peer:     peer,
		distance: distance,
	})
}

sort.Slice(peerDistances, func(i, j int) bool {
    // 修改比较函数,使用 compare 函数进行距离大小的比较
	return compare(peerDistances[i].distance, peerDistances[j].distance) < 0
})

result := make([]*Peer, 0, numPeers)
for i := 0; i < numPeers && i < len(peerDistances); i++ {
	result = append(result, peerDistances[i].peer)
}

return result

}

func (p *Peer) SetValueOptimized(key, value []byte) bool {

hash := sha256.Sum256(value)
if hash != key { // 修改了判断条件,使用 hash 和 key 进行比较
	return false
}
p.dht[hash] = value

closestPeers := p.dht.getClosestPeers(hash, 2)
for _, peer := range closestPeers {
    // 修改为使用 hash 进行传递键值对
	peer.SetValue(hash, value)
}

return true

}

func (p *Peer) GetValueOptimized(key [32]byte) []byte {

value, ok := p.dht[key]
if ok {
	return value
}

closestPeers := p.dht.getClosestPeers(key, 2)
for _, peer := range closestPeers {
    // 修改为使用 hash 进行获取键值对的操作
	value := peer.GetValue(key)
    if value != nil {
        return value 
    }
}

return nil

}

func main() {

node := NewNode()     // 创建一个节点
peer := node.peers[0] // 获取节点中的第一个 Peer

// 设置键值对
key := sha256.Sum256([]byte("hello"))
value := []byte("hello")
// 使用 SetValueOptimized 进行设置
peer.SetValueOptimized(key[:], value)

// 获取键值对
result := peer.GetValueOptimized(key)
fmt.Printf("获取到的值为: %s\n", string(result))

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=4197

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?