Аккордовый протокол. Распределенная хеш-таблица (DHT). Пиринговый. (P2P)

Я пытаюсь реализовать этот протокол: http://en.wikipedia.org/wiki/Chord_(peer-to-peer)

Из этого я понял, что каждый узел, который присоединяется к «кругу», помещается в случайное место внутри круга, в зависимости от его хэшированного значения IP + порта. Но у меня вопрос ... как я могу получить целочисленное значение (индекс) для каждого узла? Как назначить уникальное хеш-значение порта ip + уникальному номеру индекса ... Некоторые функции проверяют, находится ли, например, идентификатор внутри интервала (например, id> n & id ‹= преемник), поэтому кажется мне нужен уникальный int для каждого узла, я не могу просто использовать хеш-значение. Какие-либо предложения?


person AndreiBogdan    schedule 22.01.2012    source источник


Ответы (2)


Вы можете скачать реализацию Chord у создателей (бесплатно)

http://pdos.csail.mit.edu/chord/#downloads

(Извините, что вам просто нужен рабочий DHT!)

[править] Я считаю, что подход, основанный на хэшах, - лучший способ избежать конфликтов имен. Однако, если вам нужно использовать INT, вы можете внести небольшие накладные расходы, если ваш DHT будет управлять конфликтами имен и справляться с ними в той или иной форме. Затем, чтобы убедиться, что у вас есть представление int, вы можете просто несколько последних двух адресных пространств IP-адреса. например ip = 192.168.2.14 идентификатор будет 28.

Это, очевидно, делает вашу систему менее надежной. По какой причине вы не можете использовать хеши?

[/редактировать]

person Steve    schedule 22.01.2012
comment
Я надеялся не просматривать весь код. Может быть, есть более конкретный ответ? :) - person AndreiBogdan; 22.01.2012
comment
Хм, я только что кое-что понял, и скажите, пожалуйста, прав ли я. Могу ли я сравнить 160-битные хеш-значения, которые я получаю от IP-адреса и порта? Итак, если у меня есть 3 узла со своим хеш-значением, могу ли я сделать что-нибудь вроде ... if ((hash1 ›hash2) && (hash1‹ = hash3)) ...? - person AndreiBogdan; 22.01.2012

Разве вы не можете просто преобразовать хешированное значение в int?

Например, в Python после того, как вы возьмете хэш sha1 (ip-адрес + порт), вы получите 20 байт (160 бит). (IP-адрес - это строка, а порт - это целое число)

Преобразуйте байты в int. Вы получите число от 0 до 2 ** 160 - 1. Например,

Пусть data_in_bytes будет хеш-значением.

(int) .from_bytes (data_in_bytes, byteorder = 'big') - целочисленное значение.

Один из способов измерения расстояния между двумя значениями хеш-функции - использовать оператор XOR. int1 ^ int2 - это расстояние между двумя узлами на окружности.

person LeslieK    schedule 19.12.2015