Abp 5.0该当在.Net 6(11.09)发布后,同步发布正式版.看Abp源码是没有对Guid进行修正.
最近一贯在学习Abp框架干系的知识,在Abp文档上看到通过IGuidGenerator接口Create方法实现的GUID是连续的.便想看看内部是如何实现的.
var random = RandomNumberGenerator.Create();var randomBytes = new byte[10];random.GetBytes(randomBytes);long timestamp = DateTime.UtcNow.Ticks / 10000L;// Then get the bytesbyte[] timestampBytes = BitConverter.GetBytes(timestamp);// Since we're converting from an Int64, we have to reverse on// little-endian systems.if (BitConverter.IsLittleEndian) //判断是否为小端 { //这涉及到cpu机构 x86为小端 arm支持大端序和小端序 Array.Reverse(timestampBytes);}byte[] guidBytes = new byte[16];//通过Buffer.BlockCopy进行内容拷贝,性能更好//内部是利用Memmove 将数组转为指针,进行干系内容进行拷贝的Buffer.BlockCopy(randomBytes, 0, guidBytes, 0, 10);Buffer.BlockCopy(timestampBytes, 2, guidBytes, 10, 6);var guid = new Guid(guidBytes);//这里只是打印guid内容Console.WriteLine(guid.ToString());
看到上面的代码,可以大略地分为以下几个步骤:

1. 创建一个长度为10的byte数组,存放随机数.
2. 获取当前韶光的毫秒数
3. 判断是否为小端,如果为小端,则把韶光的毫秒数进行反转
4. 创建长度为16的byte,将随机数拷贝该数组,然后将韶光毫秒数也拷贝到该数组中
5. 通过Guid的布局函数,传入长度16的数组,进行天生连续的Guid
如果您以为对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技能互换