Si sus requisitos son:
- Debe ser reversible (es decir dado simplemente el ID "al azar", se puede encontrar la order_id el original)
- No hay columnas adicionales
- Usted no quieren mostrar order_id/interna original al usuario en todo
entonces Recomendaría algún tipo de encriptación bidireccional. Hashing no funcionará ya que no puede encontrar el valor original de un hash.
También estoy agregando que debe ser amigable para los hombres, por ejemplo. alguien puede llamarlo por teléfono
Voy a utilizar una clase de encriptación bidireccional muy simple ubicada here, que fue escrita por Tony Marston.
Queremos que la solución sea humana, así que eliminemos algunos de los caracteres. Solo he dejado caracteres en mayúsculas, números y símbolos de espacio y guión. Todos estos pueden comunicarse fácilmente usando el alfabeto fonético estándar, y el uso forzado de mayúsculas elimina cualquier confusión sobre qué es un personaje.
Estas son las cadenas revueltos que he utilizado (utilicé this online word scrambler lugar de tratar de trepar la cuerda yo):
$this->scramble1 = '-ABCDEFGHIJKLMNOPQRSTUVWXYZ ';
$this->scramble2 = 'UKAH652LMOQ FBDIEG03JT17N4C89XPV-WRSYZ';
Así que el código para crear nuestra orden humano de usar la identificación es:
<?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;
?>
(Debe descargar y guardar el archivo * encryption_class * localmente e incluirlo).
me corrieron de que el código de la línea de comandos y recibió el siguiente resultado:
Original: 123456789
Encrypted: 2UD5UIK9S
Decrypted: 123456789
Ahora tenemos nuestra corta, order_id humana de usar, que puede ser utilizado en un enlace como http://myapp.example.com/order/view/2UD5UIK9S, y que nunca necesita mostrar o comunicar el order_id interno a sus usuarios.
Notas:
El código encriptado será único una vez que su order_id es única (ya que es un PK será)
Esto no debe ser utilizado como una rutina de cifrado/descifrado contraseña - no almacene contraseñas, almacenar hashes.
Asegúrese de que su clave secreta sea aleatoria, compleja y contenga solo los caracteres en las variables $ scramble.
Ofusca solo el order_id.
Editar:
Aunque el relleno de la cadena de entrada (order_id) genera una cierta cantidad de ramdomness, se podría combinar esto con la respuesta de @ biakaveron para crear una URL como http://myapp.example.com/order/view/5cc46aea44e898c3b4e1303eb18d8161302cd367/2UD5UIK9S
Si un usuario dado es solamente capaz de ver sus pedidos, luego adivinar el siguiente OrderId no debería ser un problema. Si todos los pedidos son públicos, entonces sería mejor, desde una perspectiva de rendimiento, mantenimiento y esfuerzo, simplemente agregar una columna única que tome un valor aleatorio o al menos agregue una tabla de asignación de valores aleatorios a OrderIds. ¿Por qué la solución más simple y obvia no está sobre la mesa? – Thomas
Su edición ha cambiado sustancialmente la pregunta. Si tiene problemas para implementar el algoritmo en otro idioma, debe publicar una pregunta al respecto, con cualquier progreso que haya realizado. –