¿Cómo creo identificaciones únicas, como YouTube?

6 minutos de lectura

Avatar de usuario de Digerdoden
Digerdoden

Siempre me he preguntado cómo y por qué hacen esto…un ejemplo: http://youtube.com/watch?v=DnAMjq0haic

¿Cómo se generan estos ID de manera que no haya duplicados y qué ventaja tiene esto sobre tener un ID numérico de incremento automático simple?

¿Cómo mantenerlo corto pero aún así mantener su singularidad? La cadena que crea uniqid es bastante larga.

  • Una discusión similar está ocurriendo aquí: stackoverflow.com/questions/1075409/creating-your-own-tinyurl

    – Talljoe

    2 de julio de 2009 a las 19:25

avatar de usuario de chmac
chmac

Kevin van Zonneveld ha escrito un excelente artículo incluyendo una función PHP para hacer exactamente esto. Su enfoque es el mejor que he encontrado mientras investigaba este tema.

Su función es bastante inteligente. Utiliza una variable de índice de $ fija para que se puedan eliminar los caracteres problemáticos (vocales, por ejemplo, o para evitar la confusión entre O y 0). También tiene una opción para ofuscar las identificaciones para que no sean fáciles de adivinar.

  • Estaba a punto de publicar exactamente el mismo artículo como respuesta. es la mejor solución creo. interrogador, por favor acepte 1 como respuesta

    – estoy dentro

    8 de junio de 2012 a las 4:45

Avatar de usuario de DMCS
DMCS

Prueba esto: http://php.net/manual/en/function.uniqid.php

uniqid — Generar una identificación única…

Obtiene un identificador único prefijado basado en la hora actual en microsegundos.

Precaución
Esta función no genera valores criptográficamente seguros y no debe utilizarse con fines criptográficos. Si necesita un valor criptográficamente seguro, considere usar random_int(), bytes_aleatorios()o abressl_random_pseudo_bytes() en cambio.

Advertencia
Esta función no garantiza la unicidad del valor de retorno. Dado que la mayoría de los sistemas ajustan el reloj del sistema mediante NTP o similar, la hora del sistema cambia constantemente. Por lo tanto, es posible que esta función no devuelva una identificación única para el proceso/hilo. Usar more_entropy para aumentar la probabilidad de unicidad…

base62 o base64 codifican el valor de su clave principal y luego lo almacenan en otro campo.

ejemplo base62 para clave principal 12443 = 3eH

ahorra algo de espacio, por lo que estoy seguro de que YouTube lo está usando.

hacer una codificación base62 (A-Za-z0-9) en su PK o identificador único evitará la sobrecarga de tener que verificar si la clave ya existe 🙂

avatar de usuario de ivanakimov
ivanakimov

Tuve un problema similar: tenía identificaciones principales en la base de datos, pero no quería exponerlas al usuario; hubiera sido mucho mejor mostrar algún tipo de hash en su lugar. Entonces, escribí hashids.

Documentación: http://www.hashids.org/php/

Fuente: https://github.com/ivanakimov/hashids.php

Los hashes creados con esta clase son únicos y descifrables. Puede proporcionar un valor de sal personalizado, para que otros no puedan descifrar sus hashes (no es que sea un gran problema, pero sigue siendo “bueno tener”).

Para encriptar un número, harías esto:

require('lib/Hashids/Hashids.php');

$hashids = new Hashids\Hashids('this is my salt');
$hash = $hashids->encrypt(123);

Su $hash ahora sería: Ydx

También puede establecer la longitud mínima de hash como el segundo parámetro del constructor para que sus hash puedan ser más largos. O si tiene un sistema agrupado complejo, incluso podría cifrar varios números en un solo hash:

$hash = $hashids->encrypt(2, 456); /* aXupK */

(por ejemplo, si tiene un usuario en el clúster 2 y un objeto con id principal 456) El descifrado funciona de la misma manera:

$numbers = $hashids->decrypt('aXupK');

$numbers seria entonces: [2, 456].

Lo bueno de esto es que ni siquiera tiene que almacenar estos hashes en la base de datos. Puede obtener el hash de la URL una vez que ingresa la solicitud y descifrarlo sobre la marcha, y luego extraer las identificaciones principales de la base de datos (lo que obviamente es una ventaja en la velocidad).

Lo mismo con la salida: puede cifrar las identificaciones al salir y mostrar el hash al usuario.

EDITAR:

  1. Se cambiaron las URL para incluir tanto el sitio web del documento como la fuente del código.
  2. Se modificó el código de ejemplo para ajustarlo a las principales actualizaciones de lib (la versión actual de PHP lib es 0.3.0, gracias a toda la comunidad de código abierto por mejorar la lib)

El incremento automático se puede rastrear fácilmente. Estos no se pueden predecir y, por lo tanto, no se pueden rastrear secuencialmente.

Sugiero ir con un formato de URL doble (similar a las URL SO):

yoursite.com/video_idkey/url_friendly_video_title

Si necesita tanto la identificación como el título en la URL, puede usar números simples como 0001, 0002, 0003, etc.

Generar estas claves puede ser realmente simple. Podrías usar el uniqid() función en PHP para generar 13 caracteres, o 23 con más entropía.

  • Sin embargo, eso es todo… El esquema de URL de SO no requiere el título en absoluto, mira: stackoverflow.com/questions/1076110

    – Juan T.

    2 de julio de 2009 a las 19:11

  • Si lo que le preocupa es gatear, puede forzarlo para que requiera ambas partes.

    – mpen

    2 de julio de 2009 a las 19:12

  • Lo sé, tampoco es necesario que lo requieras. Pero si desea evitar que se rastreen 1-1,000,000, solicite también el título.

    – Sansón

    2 de julio de 2009 a las 19:55

  • ¿Qué tiene de malo gatear? Todas las páginas que no desea que los usuarios vean deben tener protección de todos modos…

    – Cameron

    23 de noviembre de 2010 a las 23:09

avatar de usuario de mpen
mpen

Si desea direcciones URL cortas y la previsibilidad no es una preocupación, puede convertir el ID de incremento automático a una base más alta.

  • Sin embargo, eso es todo… El esquema de URL de SO no requiere el título en absoluto, mira: stackoverflow.com/questions/1076110

    – Juan T.

    2 de julio de 2009 a las 19:11

  • Si lo que le preocupa es gatear, puede forzarlo para que requiera ambas partes.

    – mpen

    2 de julio de 2009 a las 19:12

  • Lo sé, tampoco es necesario que lo requieras. Pero si desea evitar que se rastreen 1-1,000,000, solicite también el título.

    – Sansón

    2 de julio de 2009 a las 19:55

  • ¿Qué tiene de malo gatear? Todas las páginas que no desea que los usuarios vean deben tener protección de todos modos…

    – Cameron

    23 de noviembre de 2010 a las 23:09

Avatar de usuario de Dev Bhaskar
Dev Bhaskar

Aquí hay una pequeña función que genera una clave única al azar cada vez. Tiene muy pocas posibilidades de repetir la misma identificación única.

function uniqueKey($limit = 10) {
    $characters="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $randstring = '';
    for ($i = 0; $i < $limit; $i++) {
        $randstring .= $characters[rand(0, strlen($characters))];
    }
    return $randstring;
}

fuente: generar identificaciones únicas aleatorias como YouTube o TinyURL en PHP

¿Ha sido útil esta solución?