C# 在C中使用Guid为实例生成唯一ID#
我有一个关于Guid作为生成ID的方法的问题。我需要能够为给定类的每个实例生成一个新的唯一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
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()使其线程安全取决于您。