Я использую Murmurhash3 для создания уникальных хэшей для ввода текста. Когда текстовые записи созданы, я использую эта реализация PHP, который возвращает 32-битное целое число хеша, чтобы получить значение хеша. Хеш хранится в столбце базы данных BINARY (16). Мне также нужно обновить нашу существующую базу данных, поэтому я использую эта реализация MySql обновить базу данных. Чтобы соответствовать хэшу, созданному php, я конвертирую его в нижний регистр.
UPDATE column SET hash=LOWER(CONV(murmur_hash_v3(CONCAT(column1, column2), 0), 10, 32));
Это соответствует php-версии примерно в 80% случаев, что явно не собирается ее сокращать. Например, хеширование строки «engtest» создает 15d15m
в php и 3uqiuqa
в MySql. Тем не менее, строка «engtest предложение» создает одинаковый хэш в обоих. Что я могу делать не так?
Догадаться. Целочисленный тип PHP подписан, и иногда Murmurhash создавал отрицательные значения хеш-функции, которые не соответствовали всегда положительным значениям MySql. Решением было отформатировать хэш-значение php, используя sprintf с форматом, установленным в «% u», перед базовым преобразованием.
$hash = murmurhash3_int($text);
return base_convert(sprintf("%u\n", $hash), 10, 32);
Увидеть php crc32 документы для получения дополнительной информации.
Других решений пока нет …