1

在 Kademlia 论文中,它提到使用XOR解释NodeID为整数的 。让我们假设 my NodeID1isaaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d和 my NodeID2is ab4d8d2a5f480a137067da17100271cd176607a1。将其解释为用于比较NodeID1和的整数的适当方法是NodeID2什么?我会将这些转换为BigIntXOR两个BigInts 吗?我在一个实现中看到了这一点。我也可以将每个转换NodeID为十进制和XOR那些值吗?

我发现了这个问题,但我试图更好地理解它是如何工作的。

注意:这不是为了实现,我只是想了解整数解释是如何工作的。

4

1 回答 1

1

对于基本的 kademlia 实现,您只需要对 ID 进行 2 位算术运算:异或和比较。对于这两种情况,ID 在概念上是一个 160 位无符号整数,带有溢出,即模 2^160 算术。它可以分解为 20 字节或 5×u32 数组,假设在后一种情况下正确的字节序转换。网络协议最常见的字节序是大字节序,因此字节 0 将包含 160 位中最重要的 8 位。

然后可以逐个子单元地应用异或或比较。即异或只是所有字节的异或,比较是二进制数组比较。

使用 bigint 库函数可能足以实现但不是最优的,因为与在固定大小的数组上实现必要的位旋转相比,它们具有大小和符号开销。

更完整的实现可能还需要一些额外的算术和实用功能。

我也可以将每个 NodeID 转换为十进制并对这些值进行异或吗?

考虑数字十进制表示的大小并不是特别有用。对于人类读者来说,十六进制或单个位更有用,计算机以二进制运行,实际上从不以十进制运行。

于 2018-11-05T19:26:54.753 回答