2012-01-22 1 views
3

Я пытаюсь реализовать этот протокол: http://en.wikipedia.org/wiki/Chord_(peer-to-peer)Протокол аккордов. Распределенная таблица хешей (DHT). Пиринговый. (P2P)

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

ответ

2

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

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

(К сожалению мысли вы просто хотели рабочий DHT!)

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

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

[/ править]

+0

Я надеялся не просматривать весь код. Получил для меня более конкретный ответ? :) – AndreiBogdan

+0

Хм, я только что понял что-то, и, пожалуйста, скажите, правильно ли я. 160-битные хэш-значения, которые я получаю от IP и порта, могу ли я сравнить их между собой? Поэтому, если у меня есть 3 узла каждый со своим хэш-значением, могу ли я сделать что-то вроде ... if ((hash1> hash2) && (hash1 <= hash3)) ...? – AndreiBogdan

0

Разве вы не можете просто конвертировать значения хэш к междунар?

Например, в python после того, как вы берете sha1-хэш (ip-address + port), вы получаете 20 байт (160 бит). (ip-адрес - строка, а порт - int)

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

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

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

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