Guids是否保证在创作时是独一无二的?

时间:2014-02-11 09:42:23

标签: c# winforms wcf unique guid

我一直在开发一个WCF服务,其中客户端使用他们登录到客户端时获得的guid登录,并且guid在WCF服务处注册。但每隔一段时间......几乎每次我都使用相同的用户登录进行登录。来自用户'x'的guid被重新使用..

这是代码:

public void Logon(ReceiveClient rc, string name)
    {
        try
        {
            inst = new InstanceContext(rc);
            DMSNotificationClient = new DMSCSSendServiceClient(inst);

            var ci = Guid.NewGuid();
            ClientId = ci;

            LoggedOnSince = DateTime.Now;

            DMSNotificationClient.Logon(name);

            ReceiveMsg += OnReceiveMsg;
            FolderChange += OnFolderChange;

        }
        catch (Exception ex)
        {
            var dmsEx = new DmsException(ex);
            DmsException.WriteErrorsToLog(dmsEx);
        }
    }

在对我的C#代码进行一些分析后,我问你这个问题:

我可以说GUID不是唯一的吗?

5 个答案:

答案 0 :(得分:2)

来自MSDN:

  

GUID是一个128位整数(16字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的可能性非常低。

答案 1 :(得分:1)

在某些情况下是的。在这个特定的情况下,没有。 The method you are calling明确指出

  

新Guid的值全部为零或相等的可能性   任何其他Guid都非常低。

所以机会绝对不是零。不可否认,我希望“非常低”处于“天文数字低”的范围内,所以我不知道为什么你这么容易得到重复,但事实是你不能盲目地相信生成的guid是唯一的。

答案 2 :(得分:1)

根据其他答案,Guids可被视为唯一的。

鉴于此,问题在于ClientId属性,该属性必须是static或类似的东西(甚至ThreadStatic),这将导致登录会话看起来“混合” “:

  • 会话1登录 ClientId == GuidA
  • 会话2登录 ClientId == GuidB
  • 第1节服务电话 ClientId == GuidB(会话2覆盖)

修改

因此,为了澄清,static变量可用于AppDomain中的所有线程(因此所有请求)。因此,只有一个这样的变量,每个请求都在更新同一个变量。如何在你的场景中避免这种情况? ......那将是一个不同的问题。

答案 3 :(得分:0)

  

我可以说GUID不是唯一的吗?

没有。参见:

  

几乎每次我使用相同的用户登录进行登录。来自用户'x'的guid重新获得   二手..

所以他们不会重新生成它,而是在数据库中查找现有的Guid。很简单。他们不使用Guid作为“每个会话唯一”,但它定义了一个特定的用户。

这与GUID保证在创建中是唯一的无关,因为很明显它们不是为每次登录创建的。

答案 4 :(得分:0)

从技术上讲,他们不是(Pidgeon Hole Principle)。但话说回来,非常不可能您经常遇到冲突。我最好的猜测是,重用源于某种缓存,但我不能根据这些信息说出更多。