C# 如何在.net中验证Guid

C# 如何在.net中验证Guid,c#,C#,请告诉我如何在.net中验证GUID,并且它始终是唯一的?GUID在99.99999999999999999999999%的时间内是唯一的 这取决于你所说的验证是什么意思 确定Guid字符串实际上是Guid的代码为: 无法验证GUID的唯一性。您只希望它是用一个工具生成的,该工具可以生成唯一的16字节。至于验证,此简单代码可能会起作用(假设您正在处理GUID的字符串表示: bool ValidateGuid(string theGuid) { try { Guid aG = new Guid

请告诉我如何在.net中验证GUID,并且它始终是唯一的?

GUID在99.99999999999999999999999%的时间内是唯一的

这取决于你所说的验证是什么意思

确定Guid字符串实际上是Guid的代码为:


无法验证GUID的唯一性。您只希望它是用一个工具生成的,该工具可以生成唯一的16字节。至于验证,此简单代码可能会起作用(假设您正在处理GUID的字符串表示:

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

  return true;
}

如果你正在寻找一种方法来确定它是否是实际的.Net
Guid
类型的格式,一个快速正则表达式就可以做到这一点。

2^128是一个非常非常大的数字。它比宇宙生命中的皮秒数大十亿倍。这个数字太大了,根本无法验证,答案注定是“42”。这就是使用它们的意义:你不必。如果你担心得到副本,那么你担心的理由是错误的。你的机器被流星撞击摧毁的几率要大得多


Duck!

这个问题已经在中讨论过了。您可能会发现更多有趣的细节

这里有一个非正则表达式的答案,应该非常快:

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;
}
公共静态布尔IsHex(此字符为c)
{

return((c>='0'&&c='a'&&c='a'&&c在.NET4中,您可以使用此扩展方法

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

我为此写了一个扩展

public static bool TryParseGuid(this Guid? guidString)
       {
           if (guidString != null && guidString != Guid.Empty)
           {
               if (Guid.TryParse(guidString.ToString(), out _))
               {
                   return true;
               }
               else
                   return false;
           }

           return false;
       }

这是一个简单的解决方法。请记住,异常应该用于异常情况,而不是用于验证类型。@Kyle Rozendo:是的,但对于正则表达式,您几乎限制了GUID字符串表示的格式。例如,在您的代码中,格式仅使用破折号。是的,我们永远不想采用“简单的解决方法”当编写成吨的代码来做同样的事情是如此的好…如果这是一个单元测试呢?那么它会被接受吗?+1用于尝试不使用异常,-1因为
Guid
可以有其他格式,并且当前方法将为以下情况引发异常:“{230a0f8b-81fb-4052-866e-9ac6a761c77”+在.NET4.0中,我们最终将看到
Guid.TryParse()的介绍
,这显然比使用正则表达式更可取。不过现在,这已经足够了,而且可以接受。Guid不是随机的,也许还有一种方法可以检查它们是否满足这些条件:如果所有生成器都遵守规则,Guid总是唯一的:方法名
TryParseGuid
通常会建议解析输出作为out参数返回(如
Enum.TryParse
等)。请考虑将此扩展方法重命名为
IsGuidValid
或类似方法,这将清楚地表明它返回
bool
public static bool TryParseGuid(this Guid? guidString)
       {
           if (guidString != null && guidString != Guid.Empty)
           {
               if (Guid.TryParse(guidString.ToString(), out _))
               {
                   return true;
               }
               else
                   return false;
           }

           return false;
       }