Основным исследованием в этой статье является код Algorithm Consependathing Algorithm.
Последовательный алгоритм хеширования был предложен MIT в 1997 году (см. 0). Цель дизайна состояла в том, чтобы решить проблему Hotpot в Интернете, и ее первоначальное намерение было очень похоже на CARP. Последовательный хэшинг исправляет проблему, вызванную простым алгоритмом хеширования, используемым CARP, так что DHT может быть по -настоящему применять в средах P2P.
Последовательный хэшинг предлагает четыре условия адаптации, которые должен соответствовать алгоритму хеширования в динамически изменяющейся среде кэша:
Баланс означает, что результат хэша может быть распределен по всем кэшам, насколько это возможно, чтобы можно было использовать все пространство кэша. Многие алгоритмы хеш -алгоритмы могут соответствовать этому условию.
Монотонность относится к тому, был ли какой -то контент отправлен в соответствующий кэш через хешинг, и в систему добавляются новые кэши. Результат хэша должен гарантировать, что оригинальный выделенный контент можно было отображать с новым кэшем, не будучи картированным с другими буферами в старой коллекции кэша.
Простые алгоритмы хеширования часто не могут соответствовать требованиям монотонности, таких как самый простой линейный хеш:
x → ax + b mod (p)
В вышеупомянутой формуле P представляет размер всех кэш. Нетрудно увидеть, что когда размер кэша изменяется (с P1 на P2), все исходные результаты хеш будут изменяться, тем самым не отвечающие требованиям монотонности.
Изменения в результатах хэша означают, что при изменении пространства кэша все отношения отображения должны быть обновлены в системе. В системах P2P изменения кэша эквивалентны соединению или выходу из системы. Эта ситуация часто возникает в системах P2P, которые принесут огромную вычислительную и передачу. Монотонность требует, чтобы хэш -алгоритм мог избежать этой ситуации.
В распределенной среде терминал может не видеть все кэши, но может видеть только некоторые из них. Когда терминал желает отображать содержимое в кеш в процессе хеширования, поскольку диапазон кэша, наблюдаемый с разными терминалами, может отличаться, результат хеширования противоречим. Окончательный результат заключается в том, что один и тот же контент отображается в разных областях кеша различными терминалами. Этой ситуации, очевидно, следует избегать, потому что она приводит к тому, что тот же контент хранится в разных буферах, снижая эффективность хранилища системы. Определение дисперсии является серьезностью вышеуказанной ситуации. Хороший алгоритм хеширования должен быть в состоянии как можно больше избежать несоответствий, то есть свести к минимуму дисперсию.
Проблема нагрузки фактически рассматривает проблему децентрализации с другой точки зрения. Поскольку разные терминалы могут отображать один и тот же контент с разными буферами, для конкретного буфера он также может быть сопоставлен с различным контентом разными пользователями. Подобно дисперсии, этой ситуации следует избегать, поэтому хороший алгоритм хеширования должен быть в состоянии минимизировать буферную нагрузку.
На первый взгляд, последовательный хэшинг нацелен на проблему распределенной буферизации, но если вы думаете о буферизации как одноранговую систему в системе P2P и содержимого сопоставления как различные общие ресурсы (данные, файлы, медиа -потоки и т. Д.), Вы обнаружите, что эти два на самом деле описывают ту же проблему.
В последовательном алгоритме хеширования каждый узел (соответствующий одноранговому в системе P2P) имеет случайно назначенный идентификатор. При сопоставлении содержимого с узлом постоянная операция хэша выполняется с использованием ключевого слова контента и идентификатора узла и получает значение ключа. Последовательный хэшинг требует, чтобы значение ключа и идентификатор узла находились в том же диапазоне значений. Самое простое значение ключа и идентификатор могут быть одномерным, например, набор целых чисел с 0000 до 9999.
При хранении контента на основе значения ключа содержимое хранится в узле с идентификатором, ближайшим к его значению ключа. Например, если значение ключа составляет 1001, существуют узлы с IDS 1000, 1010, 1100 в системе, а содержимое будет сопоставлено с 1000 узлами.
Для создания маршрутов, необходимых для запроса, хэш согласованности требует, чтобы каждый узел сохранил информацию о местоположении (IP -адрес) своего узла восходящей линии связи (значение ID больше, чем наименьшее среди своих собственных узлов) и узла нисходящей линии связи (значение ID меньше, чем самое большое среди своих собственных узлов). Когда узел необходимо найти контент, он может принять решение инициировать запрос на запрос на узел восходящей линии связи или нисходящей линии связи на основе значения ключа контента. Если узел, который получает запрос на запрос, обнаруживает, что он имеет запрошенную цель, он может непосредственно вернуть подтверждение в узел, который инициирует запрос на запрос; Если он обнаруживает, что он не принадлежит своему собственному объему, он может перенаправить запрос на свой узел восходящей линии связи/нисходящей линии связи.
Чтобы сохранить вышеупомянутую информацию о маршрутизации, когда узел соединяет/выходит из системы, соседние узлы должны своевременно обновлять информацию о маршрутизации. Это требует, чтобы узлы не только хранили непосредственно подключенную информацию о местоположении узла нисходящей линии связи, но и знали непрямую информацию о узлах нисходящей линии связи на определенной глубине (N-хоп) и динамически поддерживать список узлов. Когда узел выходит из системы, его узел восходящей линии связи будет попытаться подключиться непосредственно к ближайшему узлу нисходящей линии связи. После успеха соединения он получит список узлов нисходящей линии связи от нового узла нисходящей линии связи и обновит свой собственный список узлов. Точно так же, когда в систему добавляется новый узел, сначала найдите узел нисходящей линии связи в соответствии со своим собственным идентификатором и получите список узлов нисходящей линии связи, а затем попросите узел восходящей линии связи изменить свой список узлов нисходящей линии связи, тем самым восстановив отношения маршрутизации.
обсуждать
Последовательный хэш в основном решает наиболее важную проблему в среде P2P - как распространять хранение и маршрутизацию в динамической топологии сети. Каждый узел должен только поддерживать информацию о небольшом количестве соседних узлов, и когда узел соединяет/выходит из системы, только небольшое количество соответствующих узлов участвует в поддержании топологии. Все это делает последовательный хэш первым практическим алгоритмом DHT.
Тем не менее, алгоритм маршрутизации последовательного хэшина все еще имеет недостатки. Во время процесса запроса сообщение запроса должно пройти через o (n) step (o (n), указывает пропорциональную связь с N, а N представляет общее количество узлов в системе), прежде чем он сможет достичь узла запроса. Нетрудно представить, что когда система очень большая, количество узлов может превышать миллион, и такая эффективность запроса, очевидно, трудно удовлетворить потребности использования. С другой стороны, даже если пользователь может переносить длинные задержки, большое количество сообщений, полученных в процессе запроса, принесет ненужную нагрузку в сеть.
пакет herotrix; импорт java.util.collection; import java.util.sortedMap; импорт java.util.treemap; public class indistenthash <t> {// hash algorithm private final final hashfunct T> (); public consementAsh (hashfunction hashfunction, int numberofreplicas, collection <t> узлы) {this.hashfunction = hashfunction; this.numberofreplicas = numberofreplicas; for (t node: узлы) {add (node);}} public void add (t node) {for (int i = 0; i <numberOfReplicas; i ++) {circle.put (hashfunction.hash (node.toString ()+i), node);}} public lelement (t node) {for (int i = 0; i ++) {circle.remove (hashfunction.hash (node.tostring ()+i));}} // Алгоритм ключей public t get (object key) {if (circle.isempty ()) {return nul if (! circle.containskey (hash)) {sortedmap <integer, t> tailmap = circle.tailmap (hash); hash = tailmap.isempty ()? circle.firstkey (): tailmap.firstkey ();} return circle.get (hash);}}Выше приведено все содержание этой статьи о яковом языке Java, последовательных примечаниях к обучению алгоритмам хэш -алгоритма (примеры кода). Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!