Гарантирует ли уникальность хеширование случайного значения плюс число автоматического приращения? - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь сгенерировать уникальный номер заказа для своего приложения электронной коммерции, это мой код:

<?php
 $bytes = random_bytes(3);
 $random_hash = bin2hex($bytes);
 $order_num = $random_hash . "1";
 echo strtoupper(hash('crc32b', $order_num));

Номер заказа (в данном примере это 1), будет автоматическизначение приращения, полученное из MySQL.Это гарантирует мне уникальность?

Я хотел короткую максимальную 8-10 символов уникальное окончательное значение.Единственное решение для чисел тоже подойдет.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

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

Если вы допустите, скажем, 100 возможных значений, вы получите от них 100 возможных хешей, не более.Если злоумышленник хочет перебрать хэши, он может выбрать 100 возможных хэшей и попробовать их.

В вашем случае с 3 байтами случайности вы не получите все возможные комбинации, прежде чем получите дубликат.Таким образом, одно и то же случайное число будет сгенерировано намного раньше, чем с 3 байтами возможных комбинаций.

Существует два распространенных подхода к уникальным идентификаторам:

  1. Вы автоматически разрешаете базу данныхувеличивайте идентификатор, это гарантирует, что идентификатор уникален.
  2. Вы генерируете UUID (глобальный идентификатор с 16 байтами), который предлагает такое огромное пространство ключей, что дублирование крайне маловероятно.На практике можно исключить возможность дубликатов.

UUID имеет много преимуществ и один недостаток:

  • (+) UUID могут работать децентрализованно, например, в автономном режимесценарий.
  • (+) Можно создать идентификатор, прежде чем он будет вставлен в базу данных, поэтому не нужно ждать, пока строка будет создана в БД.
  • (+) Идентификаторыне являются детерминированными, поэтому злоумышленник не может угадать следующий идентификатор.
  • (-) Они используют больше места для хранения и немного медленнее при поиске.
0 голосов
/ 12 апреля 2019

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

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

Если это приводит к чему-то слишком длинному, вы можете сделать что-то с base_convert или asc, чтобы преобразовать число в более короткое представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...