Использование DHT для поиска материала. ША-1. Аккордовый протокол

Я пытаюсь реализовать протокол Chord, чтобы быстро найти некоторые узлы и ключи в небольшой сети. Чего я не могу понять, так это... Аккорд считает, что узлы и ключи размещены на круге. А их размещение продиктовано хэш-значениями, полученными путем применения хеш-функции SHA-1. Как именно мне работать с этими значениями? Сделать их строкой de9f2c7f d25e1b3a fad3e85a 0bd17d9b 100db4b3 и затем сравнить их как таковые, учитывая, что "a" < "b" is true ? Или как? Как узнать, находится ли ключ до или после другого?


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


Ответы (2)


Поскольку пространство ключей представляет собой кольцо, нельзя сказать, что одно значение больше другого, потому что, если вы пойдете по кольцу в обратном направлении, верно обратное. Вы можете указать, находится ли значение в диапазоне или нет. В Chord DHT каждый сервер отвечает за ключи в диапазоне значений между ним и его предшественником.

Я бы посоветовал не использовать строки для хеш-значений. Вы не должны использовать функцию hashCode для распределенные системы, но при добавлении новых узлов вам необходимо вычислять хеш-ключи. Вместо этого вы можете попробовать преобразовать хэши в BigIntegers. .

person kjw0188    schedule 24.06.2013

Хэши sha1 — это не строки, а очень длинные шестнадцатеричные числа — они часто хранятся в виде строк, потому что в противном случае им потребовался бы родной 160-битный числовой тип. Они строятся как 5 32-битных шестнадцатеричных чисел, а затем часто «нанизываются» друг на друга.

использовать строки sha1 в качестве чисел, которые они представляют, не сложно, но для этого требуется библиотека, которая может обрабатывать такие большие числа (например, BigInt или bcmath). эти библиотеки работают, вычисляя числа в строке по одному столбцу за раз справа налево, как человек, использующий ручку и бумагу для сложения, умножения, деления и т. д. обычно они имеют функции для выполнения обычных математических операций, таких как а также сравнения и т. д., и часто принимают строки в качестве аргументов. Кроме того, убедитесь, что вы используете функцию для преобразования больших чисел в любое время, когда вам нужно перейти от шестнадцатеричного к десятичному, иначе ваше 160-битное шестнадцатеричное число, скорее всего, будет округлено до 64-битного десятичного числа с плавающей запятой или аналогичного и потеряет большую часть своей точности.

сравнения больше/меньше используются в диапазонах аккорда и цифры, но делают это по модулю, так что они «переносятся», делая возможными диапазоны, такие как [64, 2]. настоящая формула

find_successor(fingers[k] = n + 2^(k-1) mod(2^160))

где «n» — это sha1 узла, а «k» — это номер пальца.

помните, что «n» будет шестнадцатеричным, в то время как «k» и «mod (160 ^ 2)» обычно будут dec, поэтому здесь потребуется ваше шестнадцатеричное значение BigInt для dec BigInt.

даже если ваша программная среда позволит вам создавать эти переменные в виде шестнадцатеричных значений, 160 — это именно dec (буквально означающий один преследуемый и шестьдесят бит), и, кроме того, обернуть свой мозг вокруг «мод (160 ^ 2)» уже достаточно сложно, не визуализируя это как шестигранник. конвертировать 'n' в dec, а не преобразовывать 'k' и т. д. в hex, а затем использовать библиотеку BigInt для выполнения математических операций, включая сравнения.

person JSON    schedule 07.11.2013