Kademlia XOR Расстояние как целое число - PullRequest
0 голосов
/ 04 ноября 2018

В газете Kademlia упоминается использование XOR из NodeID, интерпретируемого как целое число. Давайте представим, что мой NodeID1 равен aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d, а мой NodeID2 равен ab4d8d2a5f480a137067da17100271cd176607a1. Как правильно интерпретировать это как целое число для сравнения NodeID1 и NodeID2? Буду ли я конвертировать их в BigInt и XOR этих двух BigInt с? Я видел это в одной реализации. Могу ли я также просто преобразовать каждое NodeID в десятичное и XOR эти значения?

Я нашел этот вопрос, но я пытаюсь лучше понять, как именно это работает.

Примечание: это не для реализации, я просто пытаюсь понять, как работает целочисленная интерпретация.

1 Ответ

0 голосов
/ 05 ноября 2018

Для базовой реализации kademlia вам нужны только 2-битные арифметические операции с идентификаторами: xor и сравнение. В обоих случаях идентификатор концептуально представляет собой 160-битное целое число без знака с переполнением, то есть арифметика по модулю 2 ^ 160. Он может быть разложен на массив размером 20 байт или 5 × u32, предполагая правильное преобразование порядка байтов в последнем случае. Самым распространенным порядком байтов для сетевых протоколов является big-endian, поэтому байт 0 будет содержать самые значимые 8 бит из 160.

Тогда xor или сравнения могут применяться на субъединице на основе субъединицы. То есть xor - это просто xor для всех байтов, сравнение - это сравнение двоичного массива.

Использование функций библиотеки bigint, вероятно, достаточно для реализации, но не оптимально, поскольку они имеют накладные расходы по размеру и подписи по сравнению с реализацией необходимого изменения битов в массивах фиксированного размера.

Для более полной реализации могут также потребоваться некоторые дополнительные арифметические и вспомогательные функции.

Могу ли я просто преобразовать каждый NodeID в десятичное и XOR эти значения?

Учитывая размер чисел, десятичное представление не особенно полезно. Для читателя более важны шестнадцатеричные или отдельные биты, а компьютеры работают с двоичными числами и практически не с десятичными.

...