2008-09-24 4 views
1

Я ищу хэш-алгоритм, чтобы создать как можно ближе к уникальному хэшу строки (max len = 255), который создает длинное целое число (DWORD).Хэш-алгоритм

Я понимаю, что 26^255 >> 2^32, но также знаю, что число слов на английском языке намного меньше, чем 2^32.

Строки, которые мне нужны для 'hash', будут в основном одиночными словами или некоторой простой конструкцией с использованием двух или трех слов.


Ответ:

Один из FNV variants должен соответствовать вашим требованиям. Они быстрые и производят довольно равномерно распределенные выходы. (Ответил Arachnid)


ответ

2

См here для предыдущей итерации этого вопроса (и ответ).

+0

Да, т шляпа, что я ищу. Я выполнил поиск, но ключевые слова, которые я использовал, не отображаются в указанной вами ссылке. Я добавил комментарий, чтобы добавить более релевантные ключевые слова. – slashmais 2008-09-24 10:32:43

1

Один из методов заключается в использовании известного алгоритма хеширования (скажем, MD5 или SHA-1) и использования только первых 32 бит результата.

Помните, что риск столкновения хэшей увеличивается быстрее, чем вы могли ожидать. Для получения информации об этом, читайте о Birthday Paradox.

1

Ronny Pfannschmidt вчера провел тест с обычными английскими словами и не столкнулся с столкновениями для 10000 слов, которые он тестировал в хеш-функции строки Python. Я сам его не тестировал, но этот алгоритм очень прост и быстр и, похоже, оптимизирован для обычных слов.

Здесь реализация:

static long 
string_hash(PyStringObject *a) 
{ 
    register Py_ssize_t len; 
    register unsigned char *p; 
    register long x; 

    if (a->ob_shash != -1) 
     return a->ob_shash; 
    len = Py_SIZE(a); 
    p = (unsigned char *) a->ob_sval; 
    x = *p << 7; 
    while (--len >= 0) 
     x = (1000003*x)^*p++; 
    x ^= Py_SIZE(a); 
    if (x == -1) 
     x = -2; 
    a->ob_shash = x; 
    return x; 
} 
+0

У нас есть ссылка на статью/сообщение, на которое вы ссылаетесь? – 2008-09-24 10:29:39

0

String.hash в Java() может быть легко просмотрены here, его алгоритм

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]