【问题标题】:Kademlia XOR Distance as an IntegerKademlia XOR 距离作为整数
【发布时间】:2018-11-06 03:26:54
【问题描述】:
在 Kademlia 论文中提到使用 XOR 的 NodeID 解释为整数。假设我的NodeID1 是aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d 而我的NodeID2 是ab4d8d2a5f480a137067da17100271cd176607a1。将其解释为整数以比较NodeID1 和NodeID2 的适当方法是什么?我会将它们转换为BigInt 和XOR 这两个BigInts 吗?我在一个实现中看到了这一点。我也可以将每个NodeID 转换为十进制和XOR 这些值吗?
我发现了this 的问题,但我正试图更好地了解它是如何工作的。
注意:这不是为了实现,我只是想了解整数解释的工作原理。
【问题讨论】:
标签:
encoding
p2p
xor
kademlia
【解决方案1】:
对于基本的 kademlia 实现,您只需要对 ID 进行 2 位算术运算:异或和比较。对于这两种情况,ID 在概念上是一个 160 位无符号整数,带有溢出,即模 2^160 算术。它可以分解为 20 字节或 5×u32 数组,假设在后一种情况下正确的字节顺序转换。网络协议最常见的字节序是大字节序,因此字节 0 将包含 160 位中最重要的 8 位。
然后可以逐个子单元地应用异或或比较。 IE。 xor 只是所有字节的异或,比较是二进制数组比较。
使用 bigint 库函数可能足以实现,但不是最优的,因为与在固定大小的数组上实现必要的位旋转相比,它们具有大小和符号开销。
更完整的实现可能还需要一些额外的算术和实用函数。
我也可以将每个 NodeID 转换为十进制并对这些值进行异或吗?
考虑数字的大小十进制表示并不是特别有用。对于人类读者来说,十六进制或单个位更有用,计算机以二进制运行,几乎从不使用十进制。