Estoy buscando generar identificadores únicos para identificar algunos datos en mi sistema. Estoy usando un sistema elaborado que concatena algunos metadatos (no únicos, relevantes) con System.Guid.NewGuid() s. ¿Hay algún inconveniente en este enfoque, o estoy en claro?¿Hay algún inconveniente para confiar en la función System.Guid.NewGuid() al buscar ID únicos para los datos?
Respuesta
Estoy buscando generar identificadores únicos para identificar algunos datos en mi sistema.
lo recomiendo un GUID a continuación, ya que son por definición identificadores únicos globales.
Estoy utilizando un elaborado sistema que concatena algunos metadatos (no únicos, relevantes) con System.Guid.NewGuid(). ¿Hay algún inconveniente en este enfoque, o estoy en claro?
Bueno, ya que no sabemos lo que consideraría un inconveniente, es difícil de decir. Una cantidad de posibles inconvenientes vienen a la mente:
Los GUID son grandes: 128 bits son muchos bits.
No se garantiza que los GUID tengan una distribución en particular; es perfectamente legal que los GUID se generen secuencialmente, y es perfectamente legal que se distribuyan uniformemente en su espacio de 124 bits (128 bits menos los cuatro bits que son el número de versión, por supuesto). Esto puede tener graves repercusiones en la base de datos el rendimiento si el GUID se utiliza como clave principal en una base de datos indexada en orden ordenado por el GUID; las inserciones son mucho más eficientes si la nueva fila siempre va al final. Un GUID distribuido uniformemente casi nunca al final.
Versión 4 Los GUID son pseudoaleatorios pero no criptográficamente aleatorios; un atacante podría en teoría predecir cuáles son sus GUID cuando se le dé una muestra representativa de ellos. Un atacante podría, en teoría, determinar la probabilidad de que se hayan generado dos GUID en la misma sesión. Los GUID de la versión uno son, por supuesto, apenas aleatorios y le pueden decir al sofisticado lector cuándo y dónde se generaron.
Y así sucesivamente.
Estoy planeando una serie de artículos sobre estas y otras características de los GUID en las próximas semanas; mira mi blog para más detalles.
Cuando usa System.Guid.NewGuid()
, es posible que desee verificar que el guid no exista en su sistema.
Si bien un guid es tan complejo que es prácticamente único, no hay nada que garantice que no exista, excepto la probabilidad. Es increíblemente estadísticamente improbable, hasta el punto de que en casi todos los casos es lo mismo que ser único.
Generar guids idénticos es como ganar la lotería dos veces: no hay nada que realmente lo impida, es tan improbable que podría ser imposible.
La mayoría de las veces usted podría salirse con la suya sin verificar las coincidencias existentes, pero en un caso extremo con mucha generación pasando, o donde el sistema no debe fallar, podría valer la pena verificarlo.
EDITAR
quiero aclarar un poco más. Es muy, muy poco probable que alguna vez veas una guía duplicada. Ese es el punto. Es "globalmente único", lo que significa que existe una posibilidad tan infinitesimal de duplicar que puede suponer que será única. Sin embargo, si hablamos de un código que mantiene a una aeronave en el cielo, monitorea un reactor nuclear o maneja un soporte vital en la Estación Espacial Internacional, yo personalmente verificaría si había un duplicado, solo porque sería realmente terrible golpear esa caja de borde. Si solo está escribiendo un motor de blog, por otro lado, adelante, utilícelo sin verificarlo.
Siéntase libre de usar NewGuid()
. No hay problema con su singularidad.
Hay muy poca probabilidad de que genere el mismo guid dos veces; un buen ejemplo se puede encontrar aquí: Simple proof that GUID is not unique
var bigHeapOGuids = new Dictionary<Guid, Guid>();
try
{
do
{
Guid guid = Guid.NewGuid();
bigHeapOGuids.Add(guid ,guid);
} while (true);
}
catch (OutOfMemoryException)
{
}
En algún momento se acaba de estrellarse en OutOfMemory
y no en conflicto de clave duplicada.
Ese es un mal ejemplo. Un 'HashSet' no arroja una excepción al agregar un elemento duplicado, simplemente no lo agrega. Es por eso que devuelve un valor booleano que indica si se agregó algo. – hvd
@hvd: corregido asnwer. Coloque un 'Diccionario
Ninguno de nosotros esperaba nada más, por supuesto :) – hvd
- 1. ¿Hay algún inconveniente para habilitar git rerere?
- 2. ¿Hay algún inconveniente con ConcurrentHashMap?
- 3. ¿Hay algún inconveniente obvio para usar un intercambio sin asignación?
- 4. ¿Hay algún inconveniente al utilizar un tipo de retorno IEnumerable <T> para datos SQL?
- 5. ¿Debo confiar en Redis para la integridad de los datos?
- 6. ¿Hay algún inconveniente en agregar numerosos índices a las tablas?
- 7. ¿JMockit tiene algún inconveniente?
- 8. ¿Hay algún "inconveniente" con este enfoque para manejar errores en PHP?
- 9. ¿Tiene algún inconveniente para almacenar un número entero como una cadena en una base de datos?
- 10. ¿Hay algún tiempo de espera para los datos de NSDataconcontentsofurl?
- 11. ¿Hay algún inconveniente para establecer ClientIDMode = Static en cada objeto (establecido en el contenido principal de la página maestra)
- 12. ¿Hay algún inconveniente de "seguimiento asíncrono" con Google Analytics?
- 13. ¿Hay algún beneficio o inconveniente cuando un constructor implementa otro?
- 14. ¿Hay algún inconveniente en dejar los símbolos de depuración en versiones de lanzamiento?
- 15. ¿Hay algún valor predeterminado para los registros?
- 16. ¿Hay algún inconveniente en agregar un delegado vacío anónimo en la declaración de evento?
- 17. función postgreSQL para la última ID insertada
- 18. ¿Hay algún comando para detener al intérprete en Common Lisp?
- 19. ¿Hay algún texto para voz gratis para los navegadores?
- 20. Usos para la función id de Haskell
- 21. botón 'buscar' para activar la función autocompletar
- 22. ¿Hay algún inconveniente en incluir la biblioteca jquery en mi página?
- 23. ¿Hay algún límite para setTimeout?
- 24. ¿Hay algún mecanismo de enlace de datos disponible para iOS?
- 25. ¿Hay algún truco para usar los parámetros 'out' dentro de la función lambda?
- 26. ¿Hay algún método disponible para encontrar los atributos modificados para los objetos?
- 27. ID únicos con mongodb
- 28. ¿Hay algún inconveniente en el uso de barras diagonales dobles en las URL?
- 29. ¿Hay algún diseñador gráfico para ASP.NET MVC?
- 30. ¿Algún inconveniente para esta solución de sprite de CSS para pantallas 'retina'?
Pensé que había un espacio de 122 bits disponible basado en esto: http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/ 8659071.aspx ¿Está hablando de la misma implementación? –