【发布时间】:2016-05-15 11:19:38
【问题描述】:
我有一个关于将 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 冲突的愚蠢做法非常没有效率。真正的问题是您没有考虑便宜的解决方案。获得一个新的 id 是微不足道的,比前一个多一个就足够了。 40 亿已经是一个巨大的数字,但是用一个 long 来存储它,194 年你再怎么努力都无法得到一个副本。是否需要使用
++或 Interlocked.Increment() 使其成为线程安全取决于您。