一分耕耘,一分收获!既然都打开这篇《更好地理解 Kademlia 的 XOR 整数度量》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!
问题内容我正在尝试更好地掌握 kademlia 的 xor 距离度量,因此我编写了一个小虚拟程序来尝试更好地理解。我在这里也没有使用 160 位数字作为密钥,而是使用某些用户标识符的 sha256 哈希值。
这是我的异或距离函数。这或多或少是正确的吗?我对每个字节进行异或 - 将其附加到缓冲区 rawbytes
并将该字节缓冲区转换为整数。
func XorDistance(node string, otherNode string) uint64 {
var rawBytes [32]byte
for i := 0; i < 32; i++ {
rawBytes[i] = node[i] ^ otherNode[i]
}
distance, _ := binary.Uvarint(rawBytes[:])
return distance
}
解决方案
这是不正确的,因为
binary.uvarint()
只能解码64位以内的数字,而你的rawbytes是256位- “varint”编码(如 https://golang.org/src/encoding/binary/varint.go 中所述)基本上与原始字节不兼容。
您必须使用 math/big
包才能进行此类使用。这是我对您的代码片段的修改版本:
func xorDistance(node string, otherNode string) *big.Int {
var rawBytes [32]byte
for i := 0; i < 32; i++ {
rawBytes[i] = node[i] ^ otherNode[i]
}
return big.NewInt(0).SetBytes(rawBytes[:])
}
以上就是《更好地理解 Kademlia 的 XOR 整数度量》的详细内容,更多关于的资料请关注编程网公众号!