В этом задании вы реализуете алгоритмы добавления узла, удаления узла и поиска узла по ключу в консистентном хешировании.
В файле ConsistentHash.kt
находится описание интерфейса, который вам предстоит реализовать.
Свой код вы должны писать на языке Kotlin в файле ConsistentHashImpl.kt
.
Допустима также реализация на Java. Для этого, как и в предыдущих заданиях, удалите ConsistentHashImpl.kt
и вместо него напишите файл
ConsistentHashImpl.java
с классом ConsistentHashImpl<K>
, который реализует интерфейс ConsistentHash<K>
.
Вспомогательные классы описаны в файлах Shard.kt
и HashRange.kt
.
Класс Shard
описывает узел системы и задаётся своим именем. Класс HashRange
описывает отрезок хешей, перемещаемых с существующего узла на новый узел
(или с удаляемого узла на на неудаляемый узел), и задаётся своими левой и правой границами (обе границы включены в диапазон).
В этом задании вам предстоит реализовать три операции:
fun getShardByKey(key: K): Shard
— возвращается по ключу узел системы, отвечающий за этот ключ. Гарантируется, что в момент этого вызова в системе существует хотя бы один узел.K
- тип ключей, хранящихся в системе. Для получения хеша по ключу необходимо пользоваться методом hashCode.fun addShard(newShard: Shard, vnodeHashes: Set<Int>): Map<Shard, Set<HashRange>>
— добавляет новый узел в систему. Метод возвращает отображение, в котором каждому существующему узлу, который должен передать новому узлу хотя бы один отрезок хешей, сопоставлено множество отрезков хешей, которые он должен передать новому узлу. Гарантируется, что узла с таким именем в системе не существует, также в системе не существует ни одной точки изvnodeHashes
.fun removeShard(shard: Shard): Map<Shard, Set<HashRange>>
— удаляет существующий узел. Метод возвращает отображение, в котором каждому неудаляемому узлу, которому удаляемый узел должен передать хотя бы один отрезок хешей, сопоставлено множество отрезков хешей, которые ему должен передать удаляемый узел. Гарантируется, что удаляемый узел существует в системе, и что, помимо удаляемого узла, в системе существует ещё хотя бы один неудаляемый узел.
Тестирования реализации происходит путем запуска тестов ConsistentHashImplUnitTest
и
ConsistentHashImplStressTest
.
Из командной строки: ./gradlew test
.
- unit-тест проверяет несколько базовых сценариев корректности вашего решения
- stress-тест выполняет набор случайных тестов из папки
tests
Выполняйте задание в этом репозитории.
Код процесса должен быть реализован в одном файле ConsistentHashImpl.kt
или
src/ConsistentHashImpl.java
.
Инструкции по сдаче заданий находятся в этом документе.