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