Kademlia XOR 距离作为整数
Kademlia XOR Distance as an Integer
在 Kademlia 论文中提到使用 NodeID
的 XOR
解释为整数。假设我的 NodeID1
是 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
,我的 NodeID2
是 ab4d8d2a5f480a137067da17100271cd176607a1
。将其解释为用于比较 NodeID1
和 NodeID2
的整数的正确方法是什么?我会把它们转换成 BigInt
和 XOR
这两个 BigInt
吗?我在一个实现中看到了这一点。我也可以将每个 NodeID
转换为十进制和 XOR
这些值吗?
我发现了 个问题,但我正试图更好地理解它的工作原理。
注意:这不是为了实现,我只是想了解整数解释是如何工作的。
对于基本的 kademlia 实现,您只需要对 ID 进行 2 位算术运算:异或和比较。对于这两种情况,ID 在概念上都是一个 160 位无符号整数,具有溢出,即模 2^160 算术。它可以分解为 20 字节或 5×u32 数组,假设在后一种情况下正确的字节序转换。网络协议最常见的字节序是大端字节序,因此字节 0 将包含 160 位中最高的 8 位。
然后可以逐个子单元地应用异或或比较。 IE。 xor只是所有字节的异或,比较是二进制数组比较。
使用 bigint 库函数可能足以实现但不是最优的,因为与在固定大小的数组上实现必要的位旋转相比,它们具有大小和符号开销。
更完整的实现可能还需要一些额外的算术和实用函数。
Could I also just convert each NodeID into decimal and XOR those values?
考虑到数字的大小,十进制表示并不是特别有用。对于人类 reader 十六进制或单个位更有用,计算机以二进制运行,而实际上从不以十进制运行。
在 Kademlia 论文中提到使用 NodeID
的 XOR
解释为整数。假设我的 NodeID1
是 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
,我的 NodeID2
是 ab4d8d2a5f480a137067da17100271cd176607a1
。将其解释为用于比较 NodeID1
和 NodeID2
的整数的正确方法是什么?我会把它们转换成 BigInt
和 XOR
这两个 BigInt
吗?我在一个实现中看到了这一点。我也可以将每个 NodeID
转换为十进制和 XOR
这些值吗?
我发现了
注意:这不是为了实现,我只是想了解整数解释是如何工作的。
对于基本的 kademlia 实现,您只需要对 ID 进行 2 位算术运算:异或和比较。对于这两种情况,ID 在概念上都是一个 160 位无符号整数,具有溢出,即模 2^160 算术。它可以分解为 20 字节或 5×u32 数组,假设在后一种情况下正确的字节序转换。网络协议最常见的字节序是大端字节序,因此字节 0 将包含 160 位中最高的 8 位。
然后可以逐个子单元地应用异或或比较。 IE。 xor只是所有字节的异或,比较是二进制数组比较。
使用 bigint 库函数可能足以实现但不是最优的,因为与在固定大小的数组上实现必要的位旋转相比,它们具有大小和符号开销。
更完整的实现可能还需要一些额外的算术和实用函数。
Could I also just convert each NodeID into decimal and XOR those values?
考虑到数字的大小,十进制表示并不是特别有用。对于人类 reader 十六进制或单个位更有用,计算机以二进制运行,而实际上从不以十进制运行。