PHP Murmurhash3 и MySql Murmurhash3 иногда не совпадают

Я использую 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 предложение» создает одинаковый хэш в обоих. Что я могу делать не так?

2

Решение

Догадаться. Целочисленный тип PHP подписан, и иногда Murmurhash создавал отрицательные значения хеш-функции, которые не соответствовали всегда положительным значениям MySql. Решением было отформатировать хэш-значение php, используя sprintf с форматом, установленным в «% u», перед базовым преобразованием.

$hash = murmurhash3_int($text);

return base_convert(sprintf("%u\n", $hash), 10, 32);

Увидеть php crc32 документы для получения дополнительной информации.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]