Лучшее понимание целочисленной метрики XOR Kademlia - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь лучше понять показатель расстояния XOR Kademlia, поэтому я написал небольшую фиктивную программу, чтобы попытаться лучше понять. Я также не использую 160-битное число в качестве моего ключа, а скорее хэш sha256 некоторого идентификатора пользователя.

Вот моя функция расстояния xor. Это более или менее правильно? Я делаю XOR каждого байта - добавляю его в буфер rawBytes и преобразую этот байтовый буфер в целое число.

func XorDistance(node string, otherNode string) uint64 {
    var rawBytes [32]byte
    for i := 0; i < 32; i++ {
        rawBytes[i] = node[i] ^ otherNode[i]
    }
    distance, _ := binary.Uvarint(rawBytes[:])
    return distance
}

1 Ответ

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

Это не правильно, потому что

  • binary.Uvarint() может декодировать только числа в пределах 64 бит, а ваши rawBytes - 256 бит
  • Кодировка "varint" (как отмечено в https://golang.org/src/encoding/binary/varint.go) в основном не совместима с необработанными байтами.

Вы должны использовать пакет math/big для такого использования. Вот моя исправленная версия вашего фрагмента:

func xorDistance(node string, otherNode string) *big.Int {
    var rawBytes [32]byte
    for i := 0; i < 32; i++ {
        rawBytes[i] = node[i] ^ otherNode[i]
    }
    return big.NewInt(0).SetBytes(rawBytes[:])
}
...