Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Десятичный хэш

#алгоритм #php #хеширование


Числовые ключи в MySQL работают много быстрее, чем строковые. 
Нужно изготовить десятичные числа из любого хэша.
На стэке нашел решение примерно такое:
hexdec(substr(md5($element_id),-15,15)));

Есть ли более изящные методы получения десятичного хэша?
P.S. более изящных методов ведения БД пока что предлагать не нужно.
Первая строка дана только для ориентировки, например, по длине, либо чтобы не возникло
возражения, что шестнадцатиричное число - тоже число.    


Ответы

Ответ 1



Лично мне кажется, что эта задача неразрешима, поскольку все варианты с выделением фрагмента уникального хэша автоматически теряют свойство уникальности, и не могут использоваться в качестве ключа. Что-то похожее на ваш вариант, кстати говоря, делается здесь (на основании хэша sha1). То есть, вы, конечно, можете воспользоваться своим вариантом (да и любым другим вариантом с конвертированием некоторой значимой части уникального хэша), однако рискуете нарваться на неприятности в случае большого количества записей в базе данных или в случае, если звезды будут неблагосклонны :) Тем более, я думаю, что если такое преобразование было бы возможным, то это давным давно уже было бы реализовано на стороне популярных баз данных, которые допускают строковые ключи.

Ответ 2



Не очень понимаю, почему это неразрешимая коллизия. Давайте посмотрим спокойно: Есть набор байтов представляющих из себя некий хэш Набор байтов однозначно и всегда (взаимно обратимо) транслируется в целое значение - вопрос только в длине набора байтов. Пример: есть допустим хэш длиной 8 байт - это всегда и взаимно обратимо можно переложить на long (Java). Весь вопрос только упирается в длину целого. В Java этой проблемы не существует - ибо всегда можно: new BigInteger(byte[] val) и получить целое произвольной длины.

Ответ 3



А не проще вычислять хэш самому? https://code.google.com/p/boyanov/wiki/FNVHash

Комментариев нет:

Отправить комментарий