C# 在C中使用Guid为实例生成唯一ID#

C# 在C中使用Guid为实例生成唯一ID#,c#,methods,instance,guid,C#,Methods,Instance,Guid,我有一个关于Guid作为生成ID的方法的问题。我需要能够为给定类的每个实例生成一个新的唯一ID(我希望会有数百个实例)。我将我的代码包括在下面: class Program { static void Main(string[] args) { Instance instance1 = new Instance(); Console.WriteLine(instance1.ID); Instance instance2 = new

我有一个关于Guid作为生成ID的方法的问题。我需要能够为给定类的每个实例生成一个新的唯一ID(我希望会有数百个实例)。我将我的代码包括在下面:

class Program
{
    static void Main(string[] args)
    {
        Instance instance1 = new Instance();
        Console.WriteLine(instance1.ID);
        Instance instance2 = new Instance();
        Console.WriteLine(instance2.ID);
        Console.ReadKey();
    }
}
public static class GenerateID
{
    public static string NewID()
    {
        Guid guid = Guid.NewGuid();
        string id = guid.ToString();
        return id;
    }
}
public class Instance
{
    public string ID = GenerateID.NewID();
}
从我所看到的情况来看,这个方法是有效的,每次运行代码时都会生成两个唯一的ID,但我无法对此进行广泛的测试,因为我了解到Guid可以像ID的一个标签一样生成

我实现上述功能的方式是否可以确保每次ID都是唯一的?还是有可能发生碰撞?如果是这样,为实例分配唯一ID的更好方法是什么

编辑:好的,所以我从ppl的答案中了解到Guid并不是天生100%唯一的(谢谢,我会确保仔细阅读),但我的问题是,我用来获取ID的方法是否会增加生成相同两个ID的可能性?或者这是获取唯一ID的好方法吗?

Guid.NewGuid()
用MSDN的话说,“非常高的确定度”是唯一的

.NET调用调用WIN32的
CoCreateGuid()
(调用
UuidCreate
),其备注如下所示:

MSDN:

非常确定地说,此函数返回一个唯一的值–在相同或任何其他系统(网络或非网络)上的任何其他调用都不应返回相同的值-

用MSDN的话来说,
Guid.NewGuid()
是独一无二的

.NET调用调用WIN32的
CoCreateGuid()
(调用
UuidCreate
),其备注如下所示:

MSDN:

非常确定地说,此函数返回一个唯一的值–在相同或任何其他系统(网络或非网络)上的任何其他调用都不应返回相同的值-


您生成的每个GUID包含由2^128个数字组成的32个十六进制数字序列!因此,获得重复guid的机会几乎为零。考虑到由128位随机数组成的GUID,即使您同时生成它们,也有可能将重复的GUID设置为零。

您生成的每个GUID都包含由2^128个数字组成的32个十六进制数字序列!因此,获得重复guid的机会几乎为零。考虑到由128位随机数组成的GUID,即使同时生成它们,也有可能将重复的GUID设置为零

这种关于GUID冲突的愚蠢做法是非常徒劳的。真正的问题是你没有考虑廉价的解决方案。获得一个新的id很简单,比上一个多一个就足够了。40亿已经是一个巨大的数字,但要用很长的时间来存储它,无论你怎么努力,你都无法在194年内得到一个复制品。是否需要使用
++
或Interlocked.Increment()使其线程安全取决于您。这种关于GUID冲突的愚蠢做法是非常没有效率的。真正的问题是你没有考虑廉价的解决方案。获得一个新的id很简单,比上一个多一个就足够了。40亿已经是一个巨大的数字,但要用很长的时间来存储它,无论你怎么努力,你都无法在194年内得到一个复制品。是否需要使用
++
或Interlocked.Increment()使其线程安全取决于您。