Kademlia XOR Расстояние как целое число
В газете Kademlia упоминается использование XOR
из NodeID
интерпретируется как целое число. Давай притворимся NodeID1
является aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
и мой NodeID2
является ab4d8d2a5f480a137067da17100271cd176607a1
, Как правильно интерпретировать это как целое число для сравнения NodeID1
а также NodeID2
? Буду ли я конвертировать их в BigInt
а также XOR
те два BigInt
s? Я видел это в одной реализации. Могу ли я просто конвертировать каждый NodeID
в десятичную и XOR
эти ценности?
Я нашел этот вопрос, но я пытаюсь лучше понять, как именно это работает.
Примечание: это не для реализации, я просто пытаюсь понять, как работает целочисленная интерпретация.
1 ответ
Для базовой реализации kademlia вам нужны только 2-битные арифметические операции с идентификаторами: xor и сравнение. В обоих случаях идентификатор концептуально представляет собой 160-битное целое число без знака с переполнением, то есть арифметика по модулю 2^160. Он может быть разложен на массив размером 20 байт или 5×u32, предполагая правильное преобразование порядка байтов в последнем случае. Наиболее распространенным порядком байтов для сетевых протоколов является байтовый порядок байтов, поэтому байт 0 будет содержать старшие 8 бит из 160.
Затем xor или сравнения могут быть применены на основе субъединицы. Т.е. xor - это просто xor для всех байтов, сравнение - это сравнение двоичного массива.
Использование функций библиотеки bigint, вероятно, достаточно для реализации, но не оптимально, потому что они имеют накладные расходы на размер и подпись по сравнению с реализацией необходимого изменения битов в массивах фиксированного размера.
Для более полной реализации могут также потребоваться некоторые дополнительные арифметические и вспомогательные функции.
Могу ли я также просто преобразовать каждый NodeID в десятичное и XOR эти значения?
Учитывая размер чисел десятичное представление не особенно полезно. Для читателя более важны шестнадцатеричные или отдельные биты, а компьютеры работают с двоичными числами и практически не с десятичными.