Хеш с уникальным значением = уникальный хеш? - PullRequest
3 голосов
/ 04 мая 2010

Теоретически, хэширование уникального значения дает уникальное значение?

Допустим, у меня есть таблица БД с 2 столбцами: идентификатор и код. id - это автоинкрементный int, а код - varchar. Если я сделаю ...

$code = sha1($id);

... и затем сохраните $ code в той же строке, что и $ id. Будет ли мой столбец кода уникальным?

А если я добавлю текущее время? например:

$code = sha1($id . time());

Спасибо.

Ответы [ 4 ]

7 голосов
/ 04 мая 2010

В общем, ответ - нет. Это тривиально, чтобы показать: SHA-1 имеет 2 ^ 160 различных выходов - 160 бит, но есть еще много входов, которые это (например, есть 2 ^ 320 различных 40-байтовых строк, и они не могут все отображаться на уникальный вывод).

Учитывая достаточное подмножество значений, ответ может быть. Это зависит от точного алгоритма и размера подмножества: если число возможных входов меньше, чем количество возможных выходов, то это возможно (но НЕ гарантируется). Размышляя об этом, полезно помнить о парадоксе дня рождения : вероятность столкновения не увеличивается линейно с количеством входов.

0 голосов
/ 28 января 2012

Нужно задать вопрос, почему вы хотели бы это сделать? Если ваша база данных уже предоставляет вам уникальный идентификатор, зачем вам нужен другой уникальный идентификатор?

Вы также можете учесть, что вне PHP многие движки баз данных сгенерируют для вас первичные ключи в стиле UUID , если вам это нужно.

Дело в том, что алгоритмы хеширования, такие как sha1 (), не предназначены для этого типа работы; они предназначены для проверки того, что два (потенциально очень длинных) строковых входа одинаковы. Вероятность столкновения с похожей, но не точной строкой очень мала, но вероятность столкновения с очень разными строками становится намного выше.

0 голосов
/ 04 мая 2010

Существует небольшая вероятность того, что два разных значения дают одинаковый хэш. Хотя это очень мало, это не исключено.

0 голосов
/ 04 мая 2010

Зависит от алгоритма хеширования. Но теоретически, если хеш не совпадает с исходной строкой, существует вероятность того, что хеш не будет уникальным.

Хэш значения - это сжатое представление исходного значения. Удаляя фрагменты информации для создания хэша, вы теряете части того, что делает его уникальным в домене, и, следовательно, увеличивает вероятность того, что значение не будет уникальным. Единственный способ гарантировать, что он будет уникальным, - это использовать само исходное значение, которое побеждает цель хеширования.

...