У меня есть таблица MySQL MEMORY, в которой я храню данные стиля ключ-значение. Ключи обычно имеют длину 30-50 символов. И поэтому я хочу сократить их, чтобы они не занимали слишком много места в оперативной памяти (в БД будет 10 - 100 тыс. + Таких значений ключей).
Сейчас я думаю об использовании контрольной суммы CRC32 как ha sh, которая является 32-битным целым числом, и поэтому я могу использовать тип int (10) для столбца в базе данных MySQL. Но я мало беспокоюсь о возможных коллизиях при работе с хэшами 100k +, вероятность очень быстро увеличивается при наличии стольких разных ключей.
Поэтому я бы хотел использовать 64-битный га sh, где коллизии должны быть только теоретической проблемой , Я думаю. И для столбца MySQL потребуется только тип bigint (20) (при этом экономится много места в ОЗУ). Но я не смог найти ни одного разумного быстрого алгоритма CRC32, который бы был на порядок быстрее всех других функций. Ниже приведены быстрые результаты теста (100 000 итераций каждая):
crc32: 0.0074591636657715s 798740135
sha64: 0.067406177520752s 4718257680194979118
crc64: 0.037574052810669s 989304075990411149
md5: 0.02372s 0dbab6d0c841278d33be207f14eeab8b
sha1: 0.03382s 417a9e5c9ac7c52e32727cfd25da99eca9339a80
xor: 0.07939s 119
xor2: 0.06522s 134217728
add: 0.0665s 1105
Поскольку мне не нужно никакого крипто-безопасного решения, только самый быстрый способ получить 64-битное число из 50 символов длиной строка. Большое спасибо за любую идею. Я нацеливаюсь на среду PHP7 +.