Я хотел бы сгенерировать уникальный идентификатор на основе содержимого массива. Мой первоначальный подход был просто сделать:
$key = md5(json_encode($array));
Тем не менее, я хотел бы быть абсолютно уверенным, что ключ уникален, и есть вероятность, что два разных массива могут создать один и тот же хэш md5. Текущая идея состоит в том, чтобы сделать:
$key = base64_encode(json_encode($array));
Это гарантированно уникально, но дает довольно длинный ключ. Могу ли я использовать sha512 или этот тип хэша также имеет такой же потенциал для столкновения клавиш, как и md5? Есть ли способ создать более короткий ключ, чем метод base64, который на 100% гарантированно уникален?
Чтобы быть на 100% ясным, мой вопрос: Как я могу создать максимально короткий 100% уникальный идентификатор для набора данных?
Если вы хотите, чтобы уникальный ключ гарантированно соответствовал вашему контенту, то единственный способ — использовать всю длину вашего контента. Вы можете использовать строку json_encoded как есть, или вы можете запустить ее через base64_encode () или bin2hex () или аналогичные, если вы хотите, чтобы строка не содержала никаких «специальных» символов. Любая хеш-функция, такая как md5, sha1, sha256 и т. Д., Очевидно, не может быть уникальной на 100% — потому что они имеют фиксированную длину и из-за https://en.wikipedia.org/wiki/Pigeonhole_principle обязательно должны быть неуникальные результаты для входного контента, который больше, чем хеш.
На практике коллизии md5 и sha1 уже опубликованы, но существуют более сильные хеш-функции, в которых коллизии не известны или не ожидаются в течение длительного времени, поэтому вы также можете изучить использование современного хеш-алгоритма и быть достаточно безопасным, так как у вас его не будет. дубликаты.
Других решений пока нет …