在Kademlia论文中,它提到将XOR
中的NodeID
解释为整数。假设我的NodeID1
是aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
,而我的NodeID2
是ab4d8d2a5f480a137067da17100271cd176607a1
。将其解释为整数以比较NodeID1
和NodeID2
的合适方法是什么?我会把它们转换成BigInt
和XOR
那两个BigInt
吗?我在一个实现中看到了这一点。我是否也可以将每个NodeID
转换为十进制并XOR
转换为这些值?
我发现了this个问题,但我试图更好地理解它的工作原理。
注意:这不是为了实现,我只是想了解整数解释的工作原理。
答案 0 :(得分:0)
对于基本的kademlia实现,您只需对ID进行2位算术运算:异或和比较。对于这两种情况,ID在概念上都是具有溢出的160位无符号整数,即模2 ^ 160算术。假设在后一种情况下正确的字节序转换,则可以将其分解为20字节或5×u32数组。网络协议最常见的字节序为big-endian,因此字节0将包含160个字节中的最高8位。
然后,异或比较可以在一个子单元的基础上应用。即xor只是所有字节的xor,比较是二进制数组比较。
使用bigint库函数可能足以实现,但不是最优的,因为与在固定大小的数组上实现必要的位旋转相比,它们具有大小和符号开销。
更完整的实现可能还需要一些附加的算术和实用函数。
我还可以将每个NodeID转换为十进制,然后将这些值异或吗?
考虑数字的大小,十进制表示不是特别有用。对于人类读者而言,十六进制或单个位更有用,并且计算机以二进制形式运行,而实际上绝不以十进制形式运行。