Я пытаюсь реализовать протокол Chord, чтобы быстро найти некоторые узлы и ключи в небольшой сети. Чего я не могу понять, так это... Аккорд считает, что узлы и ключи размещены на круге. А их размещение продиктовано хэш-значениями, полученными путем применения хеш-функции SHA-1. Как именно мне работать с этими значениями? Сделать их строкой de9f2c7f d25e1b3a fad3e85a 0bd17d9b 100db4b3
и затем сравнить их как таковые, учитывая, что "a" < "b" is true
? Или как? Как узнать, находится ли ключ до или после другого?
Использование DHT для поиска материала. ША-1. Аккордовый протокол
Ответы (2)
Поскольку пространство ключей представляет собой кольцо, нельзя сказать, что одно значение больше другого, потому что, если вы пойдете по кольцу в обратном направлении, верно обратное. Вы можете указать, находится ли значение в диапазоне или нет. В Chord DHT каждый сервер отвечает за ключи в диапазоне значений между ним и его предшественником.
Я бы посоветовал не использовать строки для хеш-значений. Вы не должны использовать функцию hashCode
для распределенные системы, но при добавлении новых узлов вам необходимо вычислять хеш-ключи. Вместо этого вы можете попробовать преобразовать хэши в BigIntegers. .
Хэши 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 для выполнения математических операций, включая сравнения.