LINUX.ORG.RU

хеш функция

 


0

1

подскажите годный $subj, чтобы поменьше коллизий? по прикидкам, размер хеша будет небольшой, где-то до сотни

ключ - строка до 16 символов из набора [0-9A-Za-z._-]. велика вероятность повтора в ключах первых 4-5 символов.

пока что размышляю на предмет разных crc, или про нечто самописное, на основе сплита ключа на части с дальнейшими издевательствами над полученными кусочками

но может есть что более оптимально-готовое?

★★★★★
Ответ на: комментарий от Dead

это не криптография, а обычная хэш-табличка

ananas ★★★★★
() автор топика

В Java, например хэш строки:

char val[] = value;
for (int i = 0; i < value.length; i++)
    h = 31 * h + val[i];
Вместо 31 можно другое простое число.

liaonau
()

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

annulen ★★★★★
()
Ответ на: комментарий от annulen

основной приоритет - не жрать слишком много памяти. но с gperf-ом поупражняюсь, да и по ссылке сверху есть интересные идеи, спасибо

ananas ★★★★★
() автор топика
Ответ на: комментарий от unt1tled

как один из вариантов для себя уже отложил

ananas ★★★★★
() автор топика
Ответ на: комментарий от ananas

не жрать слишком много памяти

Если ты не собираешься вычислять хэш-функцию от 100500 16-символьных строк одновременно, то подойдет любая вменяемая

с gperf-ом поупражняюсь,

gperf - не единственный вариант, есть еще cmph, умеющий генерить хэш-функцию в рантайме

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от ananas

а если строки надо распознавать в процессе парсинга текста, то gperf лучше заменить на re2c

annulen ★★★★★
()

номер строки в базе уникальных вариаций

anonymous
()

Надеюсь это не будет использоваться как первичный ключ? А по сабжу, MD5.

ThePretender
()
Ответ на: комментарий от liaonau

31 годное число.

Кстати, если понадобится, натыкался на статью, где хеш произвольной структуры данных (с разными полями) считается через хеши этих полей следующим образом:

int Hash(Record &rec)
{
    int hash = 17;
    hash = hash * 31 + rec.Field1().Hash();
    hash = hash * 31 + rec.Field2().Hash();
    hash = hash * 31 + rec.Field3().Hash();

    hash = hash * 31 + rec.FieldN().Hash();
    return hash;
}

запонилось вот

Deleted
()

Самый годный будет CRC32, так как у него есть аппаратная поддержка в виде спец. инструкции из набора SSE4.2. Любые другие будут сильно отсасывать по скорости.

anonymous
()

всем спасибо, остановился на djb

ananas ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.