【问题标题】:Generating unique ID for instances using Guid in C# [duplicate]在 C# 中使用 Guid 为实例生成唯一 ID [重复]
【发布时间】: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() 使其成为线程安全取决于您。

标签: c# methods instance guid


【解决方案1】:

Guid.NewGuid() 用 MSDN 的话来说是“非常高的确定性”,独一无二。

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

MSDN:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 2014-07-03
      • 1970-01-01
      • 2015-01-21
      相关资源
      最近更新 更多