2010-03-03 13 views
10

Por favor dígame cómo validar GUID en .net y es único para siempre?Cómo validar Guid en .net

+1

de Guid son siempre únicos si todos los generadores cumplen con las reglas: http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx –

Respuesta

28

Las guías son únicas 99.99999999999999999999999999999999% de las veces.

Depende de lo que signifique por validar?

código para determinar que una cadena GUID es en realidad un Guid, es as follows:

private static Regex isGuid = 
     new Regex(@"^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$", RegexOptions.Compiled); 

internal static bool IsGuid(string candidate, out Guid output) 
{ 
    bool isValid = false; 
    output = Guid.Empty; 

    if(candidate != null) 
    { 

     if (isGuid.IsMatch(candidate)) 
     { 
      output=new Guid(candidate); 
      isValid = true; 
     } 
    } 

    return isValid; 
} 
+0

+1 por tratar de no usar excepciones, -1 porque un 'Guid 'puede tener otros formatos y el método actual lanzará una excepción para el siguiente caso:" {230a0f8b-81fb-4052-866e-9 ac6a7611c77 " –

+5

+1, en .NET 4.0, finalmente veremos la introducción de' Guid.TryParse() ', que obviamente sería preferible al uso de Regex. Por ahora, sin embargo, esto es perfectamente suficiente y aceptable. http://connect.microsoft.com/VisualStudio/feedback/details/94072/guid-tryparse –

+0

Las guías no son aleatorias, tal vez también hay una forma de comprobar si cumplen estos criterios: http://blogs.msdn.com /b/oldnewthing/archive/2008/06/27/8659071.aspx –

1

Usted no puede validar la singularidad de GUID. Solo espera que se haya generado con una herramienta que produce 16 bytes únicos. En cuanto a la validación, el código simple podría trabajar (suponiendo que se trata de representación de cadena del GUID:

bool ValidateGuid(string theGuid) 
{ 
    try { Guid aG = new Guid(theGuid); } 
    catch { return false; } 

    return true; 
} 
+1

Esa es la salida más fácil. Recuerde que las Excepciones deben usarse para circunstancias excepcionales, no para validar tipos. –

+3

@Kyle Rozendo: Sí, pero con Regex, prácticamente limitas el formato de la representación de cadena de GUID. Por ejemplo, en su código, el formateo es WITH DASHES solamente. – Kerido

+0

Sí, nunca nos gustaría tomar "la salida más fácil" cuando escribir toneladas de código para hacer lo mismo es mucho mejor ... ¿Qué pasaría si se tratara de una prueba unitaria? ¿Sería entonces aceptable? – iGanja

0

Si usted está buscando una manera de determinar si es el formato del actual tipo .Net Guid, take a look at this article. Una expresión regular rápida es la que funciona.

11

2^128 es un número muy, muy grande. Es un billón de veces más grande que el número de picosegundos en la vida del universo. Demasiado grande por una oportunidad remota para validar, la respuesta está condenada a ser "42". Cuál es el punto de usarlos: no es necesario. Si te preocupa obtener duplicados, entonces te preocupas por el motivo equivocado. Las probabilidades de que tu máquina sea destruida por un meteoro acto son considerablemente más grandes.

Duck!

0

esta pregunta ya fue discutida en this post. Usted puede encontrar los detalles más interesantes

2

Aquí es una respuesta no-expresión regular que debe ser bastante rápido:

public static bool IsHex(this char c) 
{ 
    return ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')); 
} 

public static bool IsGuid(this string s) 
{ 
    // Length of a proper GUID, without any surrounding braces. 
    const int len_without_braces = 36; 

    // Delimiter for GUID data parts. 
    const char delim = '-'; 

    // Delimiter positions. 
    const int d_0 = 8; 
    const int d_1 = 13; 
    const int d_2 = 18; 
    const int d_3 = 23; 

    // Before Delimiter positions. 
    const int bd_0 = 7; 
    const int bd_1 = 12; 
    const int bd_2 = 17; 
    const int bd_3 = 22; 

    if (s == null) 
     return false; 

    if (s.Length != len_without_braces) 
     return false; 

    if (s[d_0] != delim || 
     s[d_1] != delim || 
     s[d_2] != delim || 
     s[d_3] != delim) 
     return false; 

    for (int i = 0; 
     i < s.Length; 
     i = i + (i == bd_0 || 
       i == bd_1 || 
       i == bd_2 || 
       i == bd_3 
       ? 2 : 1)) 
    { 
     if (!IsHex(s[i])) return false; 
    } 

    return true; 
} 
0

En .NET 4, se puede utilizar este método de extensión

public static class GuidExtensions 
    { 
     public static bool IsGuid(this string value) 
     { 
      Guid output; 
      return Guid.TryParse(value, out output); 
     } 
    }