C#中如何生成GUID?
C#中如何生成GUID?
这里有一篇非常好的文章在 Raymond Chen 的博客上,描述了GUID是如何生成的,特别是为什么GUID的子串不能保证是唯一的。
基本上,GUID是使用以下组合生成的:
然而,这只是生成GUID所使用的1个特定算法(尽管我相信这是 .NET框架所使用的算法),并且不是.NET框架所使用的算法。
System.Guid
只是一个 128 位的整数(16 字节)。数字和字母与此无关。您可以使用 ToString() 方法查看 Guid 的各种“人类可读”的版本,其中包括数字 0-9 和字母 A-F(表示十六进制值),但输出方式完全由您决定。除了RFC中提到的“随机16字节”之外,还有其他形式的GUID。一些微软产品(例如SQL Server)可以选择生成这些“顺序GUID”,它们基于“系统中第一个网络卡的MAC地址+基于系统时间的递增计数器”的组合。
这些“顺序GUID”具有很好的特性,当作为带有聚集索引的数据库主键使用时,始终将新记录追加到数据库表的“末尾”。这有助于防止数据库索引碎片化和页面分裂。
如果使用随机GUID作为带有聚集索引的数据库主键,则从物理分配的角度来看,新记录将随机插入表的“中间”,这会导致索引碎片化和部分填充的数据库页面。
使用顺序GUID仍然可以在多个系统上独立生成GUID,并确信不会发生任何冲突(这是使用顺序整数作为主键而不分配“范围”或对每个系统使用不同的种子和增量所没有的属性,在大型分布式应用程序中,这是一种行政噩梦)。
总共128位。
Guid.NewGuid
生成的GUID,如https://dev59.com/CHE85IYBdhLWcg3wejfn#2757969中所述。实际上,所有语言/操作系统/框架都有很好的隐私原因来避免您在此处描述的GUID生成算法(或者至少不要将其作为默认值使用),正如罪犯David L. Smith 可以向您解释的。 - Mark Amery0
、10
、110
或111
来完成。使用string show(Guid g) => $"{g}: fam {Convert.ToString(g.ToByteArray()[8], 2)}";
show(Guid.NewGuid())
void SeeOrder(Guid g) => Console.WriteLine($"{g}\n{g:N}\n{string.Join("", g.ToByteArray().Select(b => $"{b:x2}"))}");
dd3f9bdf-ba47-4411-84c8-6cfcc5d39bb5
dd3f9bdfba47441184c86cfcc5d39bb5
df9b3fdd47ba114484c86cfcc5d39bb5
show
扩展以突出显示版本。string show(Guid g) => $"{g}: fam {Convert.ToString(g.ToByteArray()[8], 2)}, ver {g.ToByteArray()[7].ToString("x")}";
Guid是一个唯一的数字,有数十亿个排列组合,由十六进制和数字混合组成。它是基于不同的因素生成的,例如时间、Windows版本、系统资源(如硬盘、主板、设备)等等。 Guid保证是唯一的。(感谢ck!)我从未见过在连续运行中g
具有相同值的情况。
Guid g = new Guid.NewGuid();Guid g = Guid.NewGuid(); /* 感谢Dave! */
在互斥体中更常用,例如创建应用程序的单个实例,并使用带有guid的互斥体可以保证应用程序实例的生命周期。
甚至在某些情况下,它也被用于数据库,但使用方法受到反对。