Если ваши требования:
- Он должен быть обратимым (т. Е. С учетом просто"случайного" идентификатора, вы можете найти исходный идентификатор_порядка)
- Без дополнительных столбцов
- Вы вообще не хотите показывать пользователю оригинальный / внутренний код_ заказа.
тогда я бы порекомендовал какое-то двустороннее шифрование. Хеширование не будет работать, так как вы не можете найти исходное значение из хеша.
Я также добавляю, что она должна быть удобной для человека, например кто-то может позвонить вам по телефону
Я собираюсь использовать очень простой класс двустороннего шифрования, расположенный здесь , который был написан Тони Марстоном.
Мы хотим, чтобы решение было удобным для человека, поэтому давайте удалим некоторые символы схватки. Я оставил только заглавные буквы, цифры, пробел и тире. Все это может быть легко передано с использованием стандартного фонетического алфавита, а принудительное использование заглавных букв устраняет любую путаницу относительно того, что представляет собой персонаж.
Это строки шифрования, которые я использовал (я использовал это онлайн-скремблер слов вместо того, чтобы пытаться шифровать строку самостоятельно):
$this->scramble1 = '0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ ';
$this->scramble2 = 'UKAH652LMOQ FBDIEG03JT17N4C89XPV-WRSYZ';
Итак, код для создания нашего дружественного человеку идентификатора заказа:
<?php
include 'encryption_class.php';
$crypt = new encryption_class();
$key = "A-COMPLETELY-RANDOM-KEY-THAT-I-HAVE-USED";
// Min length of 8 for encrypted string
$min_length = 8;
$order_id = 123456789;
print "Original: " . $order_id . PHP_EOL;
$encrypt_result = $crypt->encrypt($key, $order_id, $min_length);
print "Encrypted: " . $encrypt_result . PHP_EOL;
// DECRYPT
$decrypt_result = $crypt->decrypt($key, $encrypt_result);
print "Decrypted: " . $decrypt_result . PHP_EOL;
?>
(Необходимо загрузить и сохранить файл * encryption_class * локально и включить его).
Я запустил этот код из командной строки и получил следующий вывод:
Original: 123456789
Encrypted: 2UD5UIK9S
Decrypted: 123456789
Теперь у нас есть наш короткий, удобный для человека order_id, который можно использовать в URL-адресе, таком как http://myapp.example.com/order/view/2UD5UIK9S,, и вам никогда не нужно отображать или передавать внутренний order_id своим пользователям.
Примечания:
Зашифрованный код будет уникальным, если ваш идентификатор_порядка уникален (так как это будет PK)
Это не должно использоваться в качестве процедуры шифрования / дешифрования пароля - не храните пароли, храните хэши.
Убедитесь, что ваш секретный ключ является случайным, сложным и содержит только символов в переменных $ scramble.
Затеняет только order_id.
Edit:
Хотя заполнение входной строки (order_id) генерирует определенное количество случайностей, вы можете объединить это с ответом @ biakaveron, чтобы создать URL-адрес типа http://myapp.example.com/order/view/5cc46aea44e898c3b4e1303eb18d8161302cd367/2UD5UIK9S