Как сохранить URL-адрес как уникальный индекс на 100% защищенным от столкновений способом?

Я хочу иметь возможность сделать большой mysql INSERT, который игнорирует вставку, когда URL-адрес уже существует в базе данных. Это будет сделано с ON DUPLICATE KEY.

Но для этого мне нужно сделать столбец url уникальным индексом.

Я сделал это, создав новый столбец с именем url_hash, где я храню хешированную MD5 версию URL-адреса, и вместо этого сделал этот столбец уникальным.

Единственная проблема в том, что после этого я подумал о том, как может работать MD5. И я понял, что это не может быть 100% защитой от столкновений. Уникальность хэшей не гарантируется на 100%. Даже если риск невелик, это может привести к столкновению.

Это заставило меня задуматься, действительно ли это лучший способ сделать это. Иметь хеш-значение в качестве уникального ключа для этой цели.

Есть ли способ сохранить URL-адрес как уникальный индекс на 100% с защитой от коллизий?


person Peter Westerlund    schedule 26.02.2016    source источник
comment
md5 не уникален, на самом деле теперь он совсем не уникален. security.stackexchange.com/questions/19906/   -  person Martin    schedule 26.02.2016
comment
Все хэш-алгоритмы по определению не защищены от коллизий из-за принципа сортировки. Однако вероятность непреднамеренного столкновения очень мала, даже при md5.   -  person Michael - sqlbot    schedule 27.02.2016


Ответы (2)


Если вы не сохраните URL-адрес как есть, вероятно, нет 100%-го способа проверки, но вы можете приблизиться к 100%, добавив дополнительный столбец индекса. Например, вы можете сохранить длину URL-адреса или второй хэш, созданный с помощью другой хеш-функции.

person Awita    schedule 26.02.2016

Вероятность случайного столкновения всего двух хэшей составляет 264 хэша, так что вы в безопасности. Если вы все равно хотите обезопасить себя, используйте SHA2() — коллизий для этого алгоритма пока не обнаружено.

person mitkosoft    schedule 26.02.2016
comment
ссылка: crypto.stackexchange.com/questions/3049/ - person Martin; 26.02.2016