我正在尝试更好地掌握 Kademlia 的 XOR 距离度量,因此我编写了一个小型虚拟程序来尝试更好地理解。我在这里也没有使用 160 位数字作为我的 key ,而是使用某个用户标识符的 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[:])
    }
    

    关于go - 更好地理解 Kademlia 的 XOR 整数指标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53166625/

    10-09 18:35