как я могу хэшировать строки в определенное количество сегментов - PullRequest
3 голосов
/ 24 марта 2011

Я пытаюсь придумать алгоритм для хэширования строки в определенное количество сегментов, но мне не посчастливилось придумать идеи, как это сделать?

У меня есть списоктаких строк:

a.jpgb.htmC.gifd.jpge.swf

и я хотел бы запустить функцию для получения числа от 1 до 4 на основе строки.

egajpg будет 3b.htm будет 2c.gif будет 1так далее

он должен быть согласованным, поэтому, если я запускаю функцию на a.jpg, он всегда возвращает 3.

этот алгоритм будет для разделения ресурсов между серверами ...

egajpg будет доступен с server3.mydomain.comb.htm будет доступен с server2.mydomain.comтак далее

Кто-нибудь знает, как мне поступить?

Любой совет будет очень признателен!

Ура

Тим

Ответы [ 4 ]

3 голосов
/ 24 марта 2011

Вы можете найти следующую запись в блоге полезной. Предлагаемый алгоритм:

int bucketIndex = (int)((uint)"d.jpg".GetHashCode() % (uint)buckets.Length);
2 голосов
/ 24 марта 2011
int bucket = (int)(unchecked(((uint)s.GetHashCode())) % 4 + 1)

(где s - строка)

1 голос
/ 24 марта 2011

Стандартный GetHashCode и% будут работать: Math.Abs("aaaa".GetHashCode()) % numberOfBuckets.

EDIT спасибо Томасу Левеску за напоминание о том, что GetHashCode () возвращает <0. Добавлен Math.Abs, чтобы иметь правильный код, но версии в других ответах, вероятно, работают лучше. </p>

0 голосов
/ 24 марта 2011

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

...