2010-03-03 8 views
10

Per favore dimmi come convalidare GUID in .net ed è unico per sempre?Come convalidare Guid in .net

+1

GUID sono sempre unico se tutti i generatori giocano secondo le regole: http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx –

risposta

28

Le istruzioni sono uniche 99.9999999999999999999999999999999999% del tempo.

Dipende da cosa intendi per convalidare?

codice per determinare che una stringa GUID è in realtà un GUID, è 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 per provare a non usare le eccezioni, -1 perché un 'Guid 'può avere altri formati e il metodo corrente genererà un'eccezione per il seguente caso:" {230a0f8b-81fb-4052-866e-9 ac6a7611c77 " –

+5

+1, in .NET 4.0, vedremo finalmente l'introduzione di' Guid.TryParse() ', che ovviamente sarebbe preferibile usare un Regex. Per ora però, questo è perfettamente sufficiente e accettabile. http://connect.microsoft.com/VisualStudio/feedback/details/94072/guid-tryparse –

+0

I suggerimenti non sono casuali, forse c'è anche un modo per verificare se soddisfano questi criteri: http://blogs.msdn.com /b/oldnewthing/archive/2008/06/27/8659071.aspx –

1

Non è possibile convalidare l'unicità di GUID. Speri solo che sia stato generato con uno strumento che produce 16 byte unici. Per quanto riguarda la convalida, questo semplice codice potrebbe funzionare (assumendo che avete a che fare con la rappresentazione di stringa del GUID:

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

    return true; 
} 
+1

Questa è la via più semplice. Ricordare che le eccezioni devono essere utilizzate per circostanze eccezionali, non per i tipi di convalida. –

+3

@Kyle Rozendo: Sì, ma con Regex, si limita praticamente il formato della rappresentazione stringa GUID. Ad esempio, nel codice, la formattazione è WITH DASHES only. – Kerido

+0

Sì, non vorremmo mai prendere "la via più facile" quando scrivere tonnellate di codice per fare la stessa cosa è molto meglio ... E se fosse un test unitario? Sarebbe quindi accettabile? – iGanja

11

2^128 è un numero molto, molto grande: è un miliardo di volte più grande del numero di picosecondi nella vita dell'universo. Troppo grande per un lungo tentativo di convalidare, la risposta è destinata a essere "42", che è il punto di utilizzo: non è necessario. Se ti preoccupi di ottenere duplicati, ti preoccupi per il motivo sbagliato. Le probabilità che la tua macchina venga distrutta da un meteorite atto sono considerevolmente più grandi.

Anatra!

0

questa domanda è già stata discussa in this post. Si possono trovare dettagli più interessanti

2

Ecco una risposta non Regex che dovrebbe essere abbastanza veloce:

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

NET 4, è possibile utilizzare questo metodo di estensione

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