Вопрос подстроки Sha1 - PullRequest
       17

Вопрос подстроки Sha1

1 голос
/ 08 октября 2010

Я делаю сайт типа pastebin и пытаюсь сделать id случайной строкой, например paste.com/4RT65L

Я получаю sha1 идентификатора, прежде чем добавить его в базу данных, но яполучаю подстроку первых 8 символов sha1.есть ли у них возможность быть двойной копией одного и того же ша1?Я не хочу, чтобы они случайно стали второй пастой с идентификатором, который уже использовался?

Ответы [ 3 ]

6 голосов
/ 08 октября 2010

Ну, вероятность столкновения в 8 символов значительно выше, чем вероятность столкновения с двумя ключами Sha1, но это не значит, что, скорее всего, это произойдет.

Я бы порекомендовалВы делаете некоторые тесты на нем.Создайте случайный ввод и посмотрите, сколько времени потребуется, чтобы столкновение произошло.Если вам нравятся результаты, то иди с этим.В противном случае вам понадобится более длинная строка.

РЕДАКТИРОВАТЬ: Вы также можете рассчитать шансы на столкновение, посмотрев на парадокс дня рождения .

В основном, если выберут первые 8 шестнадцатеричных цифр из SHA-1, затем у вас есть 16 ** 8 (4 294 967 296) различных доступных комбинаций.

Используя онлайн-калькулятор Birthay Paradox, после примерно 9200 хешей у вас будет 1% вероятность столкновения.Потребуется около 30 000 хешей, прежде чем у вас будет шанс 10%, и 77 000, прежде чем у вас будет шанс 50%.

Важно отметить, что, пока ваша хеш-функция выполняет достойную работу, она является псевдо-случайный, не имеет значения, какой из них вы используете (будь то SHA1, MD5 или любая другая форма контрольной суммы) - эти числа предполагают совершенно случайные входные данные, и, таким образом, вы можете только приблизиться к этим значениям, используя все более совершенные хэш-функции.1013 *

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

1 голос
/ 08 октября 2010

Перед назначением идентификатора вы всегда можете проверить, что он не занят ... или, что еще лучше, поставить уникальный идентификатор в поле базы данных ... проблема решена.:)

Подождите, вы говорите SHA1 идентификатора.Вы не имеете в виду идентификатор autoinc?Мои первые предположения будут:

356a192b
da4b9237
77de68de

Если вы используете случайный идентификатор, зачем запускать на нем sha1?

0 голосов
/ 08 октября 2010

Я понял это, мой код:

strtoupper(substr(sha1($token_start . $id . $token_end), 0, 8))

, где $ id - это идентификатор, который получается при определении общего количества идентификаторов в базе данных + 1, являясь следующим идентификатором.так как это автоинкремент.

, тогда, когда он вставляет запись, он вставляет зашифрованные.

$ token_start и $ token_end - это случайные строки, которые можно выбрать, чтобы сделать новый идентификатор уникальным.

Я сделал цикл, который вставлял их 32 000 раз в базу данных, только идентификатор, автоинкремент вместе с новым идентификатором, и я выполнил поиск с отчетливым и не получил никаких повторов.этого более чем достаточно для меня.Любые комментарии будут полезны.Я не знаю, сколько времени это займет, пока не произойдет столкновение.если кто-нибудь знает, когда будет первый, это было бы здорово.

...