我一直在开发一个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不是唯一的吗?
答案 0 :(得分:2)
来自MSDN:
GUID是一个128位整数(16字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的可能性非常低。
答案 1 :(得分:1)
在某些情况下是的。在这个特定的情况下,没有。 The method you are calling明确指出
新Guid的值全部为零或相等的可能性 任何其他Guid都非常低。
所以机会绝对不是零。不可否认,我希望“非常低”处于“天文数字低”的范围内,所以我不知道为什么你这么容易得到重复,但事实是你不能盲目地相信生成的guid是唯一的。
答案 2 :(得分:1)
根据其他答案,Guids可被视为唯一的。
鉴于此,问题在于ClientId
属性,该属性必须是static
或类似的东西(甚至ThreadStatic
),这将导致登录会话看起来“混合” “:
修改强>
因此,为了澄清,static
变量可用于AppDomain中的所有线程(因此所有请求)。因此,只有一个这样的变量,每个请求都在更新同一个变量。如何在你的场景中避免这种情况? ......那将是一个不同的问题。
答案 3 :(得分:0)
我可以说GUID不是唯一的吗?
没有。参见:
几乎每次我使用相同的用户登录进行登录。来自用户'x'的guid重新获得 二手..
所以他们不会重新生成它,而是在数据库中查找现有的Guid。很简单。他们不使用Guid作为“每个会话唯一”,但它定义了一个特定的用户。
这与GUID保证在创建中是唯一的无关,因为很明显它们不是为每次登录创建的。
答案 4 :(得分:0)
从技术上讲,他们不是(Pidgeon Hole Principle)。但话说回来,非常不可能您经常遇到冲突。我最好的猜测是,重用源于某种缓存,但我不能根据这些信息说出更多。