Метод хеширования, который позволяет увеличивать количество сегментов, не портя предыдущее отображение данных - PullRequest
2 голосов
/ 03 мая 2011

Существует ли алгоритм / метод, который позволяет мне увеличивать количество сегментов без перестройки данных / повторного хеширования.

Проблема на практике: Скажем, у вас есть группа пользователей, которые идентифицируются строкой «username». Затем вы хэшируете эти «имена пользователей» в список сегментов.

This is done by something like:
String username = "user";
int index = username.hash();
int bucketIndex = index % bucketlist.size();

Так что в этой схеме, если бы я захотел увеличить количество «сегментов», нужно было бы также переместить данные в сегменты. Чтобы он соответствовал новому индексу сегмента, полученному при выполнении по модулю с другим номером.

Это действительно просто отображение. Где найти корзину, которая принадлежит данному пользователю.

Возможные тупые решения: Имейте и старый размер ведра и новый размер ведра. А потом попробуйте заглянуть в два ведра. Затем медленно переместите всех пользователей так, чтобы они соответствовали, используя новый bucketlist.size (). Это не потребует полной остановки при хешировании и перемещении.

Что нужно: Это действительно перемещение всех пользователей, что плохо. И поиск во многих ведрах, чтобы найти правильное, также не идеален.

И весь смысл в том, чтобы иметь возможность точно определить, какую корзину в списке использовать, просто используя алгоритм.

И размер списка сегментов не может быть частью имени пользователя.

Нет необходимости хешировать, как это делается здесь, если примерно так же.

Я не знаю, есть ли разумный ответ на это ...

Ответы [ 2 ]

0 голосов
/ 03 мая 2011

Я думаю, что вы ищете линейное хеширование .

Вы также можете рассмотреть любой из множества видов сбалансированных бинарных деревьев. У них есть замечательное свойство: вы можете продолжать их выращивать, не переставляя мир в любой момент.

0 голосов
/ 03 мая 2011

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

...