Go 更好地理解卡德姆利亚';s XOR整数度量

Go 更好地理解卡德姆利亚';s XOR整数度量,go,distributed,p2p,xor,kademlia,Go,Distributed,P2p,Xor,Kademlia,我试图更好地掌握Kademlia的XOR距离度量,所以我编写了一个小的虚拟程序来尝试更好地理解。这里我也没有使用160位的数字作为密钥,而是使用某个用户标识符的sha256散列 这是我的xor距离函数。这或多或少是正确的吗?我对每个字节进行异或运算——将其附加到缓冲区rawBytes,并将该字节缓冲区转换为整数 func XorDistance(node string, otherNode string) uint64 { var rawBytes [32]byte for i

我试图更好地掌握Kademlia的XOR距离度量,所以我编写了一个小的虚拟程序来尝试更好地理解。这里我也没有使用160位的数字作为密钥,而是使用某个用户标识符的sha256散列

这是我的xor距离函数。这或多或少是正确的吗?我对每个字节进行异或运算——将其附加到缓冲区
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
}
func XorDistance(节点字符串、其他节点字符串)uint64{
var rawBytes[32]字节
对于i:=0;i<32;i++{
rawBytes[i]=节点[i]^otherNode[i]
}
距离,:=二进制.Uvarint(rawBytes[:])
返回距离
}

这不正确,因为

  • binary.Uvarint()
    只能解码64位以内的数字,而您的原始字节数是256位
  • “varint”编码(如中所述)基本上与原始字节不兼容
您必须使用
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[:])
}
func xOrdinance(节点字符串,其他节点字符串)*big.Int{
var rawBytes[32]字节
对于i:=0;i<32;i++{
rawBytes[i]=节点[i]^otherNode[i]
}
返回big.NewInt(0.SetBytes)(rawBytes[:])
}

interest–当两个标识符不同时,UvarInt()实际上返回了一个值。这可能只是使用了前64位的截断吗?@Aroo我做了更多的研究,发现
Uvarint()
(及其签名兄弟)使用了中描述的唯一编码(也在
encoding/binary
包的源代码中),该编码将最低有效位放在第一位,每个字节有7位数据(而不是8位)。因此,在试图解释字节片中的任意数据时,会产生意外的结果。回答已更新。@aroo另外,建议您添加检查
节点
其他节点
的长度,以及相应的
错误类型的返回值,以避免
索引超出范围
恐慌。