2009-08-19 20 views
6

Necesito generar una identificación de registro única para la cadena única dada.recorte uuid más para hacer cadena corta

Intenté usar el formato uuid que parece ser bueno.

Pero creemos que es extenso.

así que tenemos que reducir la cadena de uuid 9f218a38-12cd-5942-b877-80adc0589315 a más pequeño. Al eliminar '-' podemos guardar 4 caracteres. ¿Cuál es la parte más segura para eliminar de uuid? No necesitamos una identificación única universal, pero nos gusta usar uuid como fuente pero cortar cadenas.

Necesitamos una identificación única específica para el sitio/base de datos (SQL Server/ADO.NET Data services).

Cualquier idea o muestra de cualquier idioma es bien

Gracias de antemano

Respuesta

3

Si está utilizando MS-SQL se debe, probablemente, sólo tiene que utilizar el tipo de datos uniqueindentifier, es a la vez compacto (16 bytes), y desde el motor de SQL sabe sobre él se pueden optimizar los índices y las consultas de usarlo.

+1

Un UUID también tiene 16 bytes, por lo que no lo hace más pequeño. –

+0

Glenn, uniqueindentifier == UUID, pero el OP definitivamente estaba hablando de almacenarlo como una cadena. –

0

Un UUID tiene 128 bits. ¿Has considerado hacer una CRC de eso? Eso podría bajarlo a 16 o 32 bits fácilmente, y usaría toda la información original. Si un CRC no es lo suficientemente bueno, siempre puede usar los primeros bytes de un hash adecuado (SHA256, por ejemplo).

Si realmente desea simplemente cortar el UUID, el formato del mismo se describe en RFC 4122. Debería poder averiguar qué partes su implementación no necesita de eso.

+1

Un CRC no sería único en absoluto. –

+1

Depende de la cantidad de exclusividad que necesita. Es por eso que sugerí CRC y una alternativa. –

+1

Desafortunadamente, no puede reducir los bits en bruto del UUID sin quitar su estado como UUID. Esto se debe a que debe haber 128 bits de aleatoriedad para ser considerado un UUID y reducir suficientemente la posibilidad de una colisión cerca de cero. –

2

Un UUID proporciona (casi) 128 bits de exclusividad. Puede acortarlo a 16 bytes binarios, o 22 caracteres codificados en base64. No recomendaría eliminar ninguna parte de un UUID, de lo contrario, simplemente pierde su sentido. Los UUID se diseñaron para que todos los 128 bits tengan significado. Si quiere menos que eso, debe usar algún otro esquema.

Por ejemplo, si pudiera garantizar que solo se utilizan los UUID de la versión 4, entonces podría tomar solo los primeros 32 bits, o solo los últimos 32 bits. Pierdes la singularidad, pero tienes números bastante aleatorios. Solo evite los bits que están corregidos (versión y variante).

Pero si no puede garantizar eso, tendrá problemas reales. Para los UUID de la versión 1, los primeros bits no serán exclusivos para los UUID generados en el mismo día, y los últimos bits no serán exclusivos para los UUID generados en el mismo sistema. Incluso si CRC el UUID, no se garantiza que tendrá 16 o 32 bits de exclusividad.

En este caso, solo use algún otro esquema. Genere un número aleatorio de 32 bits utilizando el generador de números aleatorios del sistema y úselo como su ID única. No confíe en los UUID si tiene la intención de eliminar su longitud.

2

El UUID es de 128 bits o 16 bytes. Sin codificación, puede obtenerla tan baja como 16 bytes. Los UUID se escriben comúnmente en hexadecimal, lo que los convierte en cadenas de 32 bytes legibles.Con otras codificaciones, se obtienen resultados diferentes:

  1. base 64 vueltas 3 de 8 bits bytes en 4 caracteres de 6 bits, por lo que 16 bytes de datos se convierte en 22 caracteres de longitud
  2. base 85 vueltas 4 8- bytes de bits en 5 caracteres de 6,4 bits, por lo que 16 bytes de datos pasan a ser 20 caracteres

Todo depende de si desea cadenas legibles y qué estándar/común es la codificación que desea usar.

Cuestiones relacionadas