【发布时间】:2011-11-02 13:32:43
【问题描述】:
有没有办法每次都生成一个 100% 新的 GUID 而不会在整个应用程序中发生冲突?
由于我无法在八小时内回答我的问题,我想出了解决方案:
internal static class GuidGenerator
{
private static readonly HashSet<Guid> _guids = new HashSet<Guid>();
internal static Guid GetOne()
{
Guid result;
lock (_guids)
while (!_guids.Add(result = Guid.NewGuid())) ;
return result;
}
internal static void Utilize(Guid guid)
{
lock (_guids)
_guids.Remove(guid);
}
}
这段代码是否解决了应用内的问题?
编辑:呃,它变得复杂了。线程安全扼杀了速度。
【问题讨论】:
-
您必须使用无限长的 GUID。
-
@AgentFire:GUID 是否应该是全球唯一的?对于整个应用程序,我相信
.NewGuid()就足够了。除非您是在谈论 universe 中的唯一 ID? -
@AgentFire 这相当于在阳光明媚、万里无云的日子里待在室内以避免被闪电击中。
-
@AgentFire 只要您使用有限长度的 GUID,就永远不会 100% 保证您不会遇到 GUID 冲突。 Daniel 和 CodeInChaos 所说的是,在实践中实际发生冲突的可能性非常小,以至于您的应用程序由于其他原因而失败的可能性要大得多,例如运行它的硬件故障,而不是因为 GUID碰撞。
-
你为什么不直接使用你递增的整数计数器?
标签: c#