2010-07-15 18 views
7

Necesito generar una cadena única de 30 caracteres de longitud. Al principio, iba a generar un GUID y simplemente eliminar los dos primeros caracteres.GUID, cadena aleatoria de 30 caracteres

Guid.NewGuid().ToString("N").Substring(2); 

¿Eliminar los dos primeros caracteres tiene un efecto significativo en la "singularidad"? ¿Es algo de lo que debería estar preocupado?

¿Existe alguna forma mejor de generar una cadena aleatoria de 30 caracteres que se garantizará como única?

Respuesta

5

Eliminar dos caracteres hexadecimales o equivalentemente 8 bits de un GUID lo hará menos único, pero 120 bits todavía tienen un valor único bastante bueno. Si no desea generar millones de identificadores por segundo, sería seguro eliminar algunos bits de la marca de tiempo y el uniquificador sin riesgo de colisión. Ver por ejemplo la Wikipedia para el structure of GUIDs.

Una solución alternativa sería codificar el GUID en Base64 o algo así si no está restringido a caracteres hexadecimales solamente. 128 bits codificados en Base64 producen una cadena de longitud 24. Luego, puede agregar otros 6 caracteres aleatorios para rellenar la cadena con 30 caracteres, lo que la hace aún más única.

+0

El carácter 13 (GUID generado en .NET) siempre parece estar "4". Supongo que este es uno de los bytes fijos que puedo eliminar. ¿Dónde se ubicaría la marca de tiempo o el uniquifier? – harmony

+0

El 4 indica la versión del algoritmo utilizado para generar el GUID. Consulte http://msdn.microsoft.com/en-us/library/cc246027.aspx y las RFC mencionadas allí para la estructura interna. –

5

Truncar un GUID pierde la singularidad. Para entender por qué debería entender cómo se crea un GUID. Se compone de unas pocas partes:

  • 60 bits de marca de tiempo
  • 14 bits de uniquifier
  • 48 bits de identificador de equipo
  • 6 bits se fijan

descartando los dos primero caracteres que está descartando los 8 bits más significativos de la parte de la marca de tiempo. This article lo explica bien y los peligros de truncar GUID. También explica cómo podría usar la misma técnica utilizada en los GUID para crear identificadores únicos que no sean únicos en el mundo, pero serán únicos para circunstancias más restringidas.

1

Como dije antes que yo, si solo quita dos caracteres del GUID, entonces ya no será único.

Pero hay otra manera: es posible acortar un GUID a hasta 20 caracteres sin perder información o unicidad mediante la codificación ASCII.

Control hacia fuera este post del blog de Jeff Atwood:
Coding Horror: Equipping our ASCII Armor