Я пытаюсь придумать хорошую хеш-функцию для строк. И я подумал, что было бы хорошей идеей суммировать значения Юникода для первых пяти символов в строке (при условии, что у него есть пять, иначе остановитесь там, где он заканчивается). Это хорошая идея или плохая?
Я делаю это на Java, но я не думаю, что это будет иметь большое значение.
String
собственныйhashCode()
?Ответы:
Обычно хэш не будет делать суммы, в противном случае
stop
иpots
будет иметь тот же хэш.и вы бы не ограничивали его первыми n символами, потому что иначе дом и домики имели бы одинаковый хеш.
Обычно хэши принимают значения и умножают их на простое число (повышает вероятность создания уникальных хэшей). Таким образом, вы можете сделать что-то вроде:
источник
Если это вопрос безопасности, вы можете использовать криптографию Java:
источник
Вы, вероятно, должны использовать String.hashCode () .
Если вы действительно хотите реализовать hashCode самостоятельно:
Использование только первых пяти символов - плохая идея . Подумайте об иерархических именах, таких как URL: все они будут иметь одинаковый хэш-код (поскольку все они начинаются с «http: //», что означает, что они хранятся в одном и том же сегменте в хэш-карте, демонстрируя ужасную производительность.
Вот история войны, перефразированная на String hashCode из « Эффективной Java »:
источник
Если вы делаете это на Java, то почему вы это делаете? Просто позвони
.hashCode()
на строкуисточник
.hashCode()
. Скорее используйте некоторый известный алгоритм.String::hashCode
указан в JDK, поэтому он так же переносим, как и само существование классаjava.lang.String
.Гуава
HashFunction
( Javadoc ) обеспечивает достойное не крипто-сильное хеширование.источник
404
.Эта функция, предоставленная Ником, хороша, но если вы используете новое String (byte [] bytes) для преобразования в String, она не удалась. Вы можете использовать эту функцию для этого.
Может быть, это может кому-то помочь
источник
Логика источника позади хеш-функции djb2 - SO
источник
Ходят слухи, что FNV-1 - хорошая хеш-функция для строк.
Для длинных строк (длиннее, скажем, около 200 символов) вы можете получить хорошую производительность с помощью хеш-функции MD4 . Как криптографическая функция, она была взломана около 15 лет назад, но для не криптографических целей она все еще очень хорошая и удивительно быстрая. В контексте Java вам придется преобразовывать 16-битные
char
значения в 32-битные слова, например, группируя такие значения в пары. Быстрая реализация MD4 в Java может быть найдена в sphlib . Вероятно, излишним в контексте заданий в классе, но в противном случае стоит попробовать.источник
Если вы хотите увидеть реализации отраслевого стандарта, я бы посмотрел на java.security.MessageDigest .
«Дайджесты сообщений - это безопасные однонаправленные хеш-функции, которые принимают данные произвольного размера и выводят хеш-значение фиксированной длины».
источник
вот ссылка, которая объясняет множество различных хеш-функций, сейчас я предпочитаю хеш-функцию ELF для вашей конкретной задачи. Он принимает в качестве входных данных строку произвольной длины.
источник
sdbm: этот алгоритм был создан для библиотеки базы данных sdbm (переопределение публичного домена ndbm)
источник
источник
Хорошая идея работать с нечетным числом, когда пытаешься разработать хорошую функцию hast для строки. эта функция принимает строку и возвращает значение индекса, пока что ее работа довольно хороша. и имеет меньше столкновений. индекс колеблется от 0 до 300, может быть, даже больше, но пока я не поднялся выше даже с такими длинными словами, как «электромеханика»
другое, что вы можете сделать, это умножить каждый символ int parse на индекс по мере его увеличения, как слово «медведь» (0 * b) + (1 * e) + (2 * a) + (3 * r), которое даст вам значение int для игры. первая вышеупомянутая хеш-функция сталкивается с «здесь» и «слышит», но все же великолепно дает некоторые хорошие уникальные значения. приведенный ниже не сталкивается с «здесь» и «слышать», потому что я умножаю каждый символ на индекс по мере его увеличения.
источник
Вот простая хеш-функция, которую я использую для хеш-таблицы, которую я построил. Это в основном для того, чтобы взять текстовый файл и хранить каждое слово в индексе, который представляет алфавитный порядок.
Что это в основном делает, так это слова хэшируются в соответствии с их первой буквой. Таким образом, слово, начинающееся с 'a', получило бы хеш-ключ 0, 'b' получило бы 1 и т. Д., А 'z' было бы 25. Числа и символы имели бы хеш-ключ 26. Это преимущество, которое это обеспечивает ; Вы можете легко и быстро вычислить, где данное слово будет проиндексировано в хеш-таблице, поскольку все это в алфавитном порядке, что-то вроде этого: Код можно найти здесь: https://github.com/abhijitcpatil/general
Это будет вывод:
источник
Это позволит избежать любого столкновения и будет быстрым, пока мы не будем использовать сдвиг в вычислениях.
источник