C#根据时间产生有序的GUID编码

public static Guid GenerateGuid()
{
    byte[] guidArray = Guid.NewGuid().ToByteArray();

    var baseDate = new DateTime(1900, 1, 1);
    DateTime now = DateTime.Now;
    var days = new TimeSpan(now.Ticks - baseDate.Ticks);
    TimeSpan msecs = now.TimeOfDay;

    byte[] daysArray = BitConverter.GetBytes(days.Days);
    byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds / 3.333333));

    Array.Reverse(daysArray);
    Array.Reverse(msecsArray);

    Array.Copy(daysArray,daysArray.Length - 2,guidArray,guidArray.Length - 6,2);
    Array.Copy(msecsArray,msecsArray.Length - 4,guidArray,guidArray.Length - 4,4);

    return new Guid(guidArray);
}
public static Guid GenerateGuid()
{
    byte[] guidArray = Guid.NewGuid().ToByteArray();

    var baseDate = new DateTime(1900, 1, 1);
    DateTime now = DateTime.Now;
    var days = new TimeSpan(now.Ticks - baseDate.Ticks);
    TimeSpan msecs = now.TimeOfDay;

    byte[] daysArray = BitConverter.GetBytes(days.Days);
    byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds / 3.333333));

    Array.Reverse(daysArray);
    Array.Reverse(msecsArray);

    Array.Copy(daysArray,daysArray.Length - 2,guidArray,guidArray.Length - 6,2);
    Array.Copy(msecsArray,msecsArray.Length - 4,guidArray,guidArray.Length - 4,4);

    return new Guid(guidArray);
}
时间: 2024-08-07 12:16:21

C#根据时间产生有序的GUID编码的相关文章

创建有序GUID

数据库中如果用GUID作主键(默认聚簇索引),会产生页面碎片,可以用UUID来解决这个问题: [DllImport("rpcrt4.dll", SetLastError = true)] private static extern int UuidCreateSequential(out Guid guid); /// <summary> /// 创建有序的 guid. /// </summary> /// <returns></returns

C#实现SQLSERVER数据库中有序GUID生成(NewSequentialId)

GUID作为数据库主键由于其无序性所以性能不怎么好,SQL Server中有个函数NewSequentialId可以生成有序的GUID,由于在程序中需要用到,就用C#实现了一下,生成的GUID格式基本和SQL Server一致. 程序代码参考了rpcrt4.dll中UuidCreateSequential的实现. 1 public class GuidHelper 2 { 3 private static bool initialised; 4 private static int count;

闲谈系列之一——数据库主键GUID

昨日一个行内兄弟由于工作调动要派到某二线城市工作,虽然有高额工资和补助的诱惑但也难以释怀离京蛋蛋的忧桑,约好晚上到老聚点道个别.主要是聊(chui)聊(chui)前(niu)程(bi),几瓶夺命大绿棒子下肚,这货问起我现在项目的情况(操蛋的技术控!),我简单的说了一下架子和数据库,果然在数据库主键上出现了分歧,在他心里主键就是应该是妥妥的自增整型,对于我的GUID无法容忍,并指出GUID不连续.效率低下.blablabla,最后我说了一下我的解决方案总算得到了一定程度的肯定吧... 对于程序猿来

UniqueIdentifier 数据类型 和 GUID 生成函数

UniqueIdentifier 数据类型用于存储GUID的值,占用16Byte. SQL Server将UniqueIdentifier存储为16字节的二进制数值,Binary(16),按照特定的格式显示,显示的格式是:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中,x是16进制数字,数值范围是从0-9,A-F.由于每个字节存储2个16进制数据,因此,按照存储字节,UniqueIdentifier的格式简写为:4B-2B-2B-2B-6B.使用GUID的好处是:

哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 术语: i)路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径. 路径中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. ii)结点的权及带权路径长度 若对树中的每个结点赋给一个有着某种含义的数值,则这个数值称为该结点的权. 结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积. iii)树的带权路径长度 树的带权路径长度:所有叶子结点的带权路径长度之和,记为WPL. 先了解一下

多些时间少写些代码

我在我的微博上说过这样一段话,我想在这里把我的这个观点阐述地更完整一些. @左耳朵耗子:聪明的程序员使用50%-70%的时间用来思考,尝试和权衡各种设计和实现,而用30% – 50%的时间是在忙碌着编码,调试和测试.聪明的老板也会让团队这样做.而傻逼的老板,苦逼的程序员会拿出来100%-150%的时间来忙着赶进度,返工,重构,fix 大量的bug… 所以, 越差的团队一般会越忙,而且还忙不完. 在现在这个浮躁的时期,再加上敏捷咨询师们念的歪经,他们让人感觉上就像是软件产品是可以在很短的时间内高质

UTF编码问题小结

在编程当中经常出现乱码的问题,而由此一般会引发很多惨剧,如读文件不成功.用户名显示乱码等,所以端午节抽了一小点时间好好看了一下编码问题,以备遗忘. 首先是中文编码,除了台湾和香港常用的BIG5,国内大概都用的是gb2312,这个可以从各大门户的首页源码中找到一些线索.还有一种叫gbk,这是微软对gb2312的拓展.主要由于gb2312只能表示6763个简体汉字,682个符号,具体可见字符区别. 然后是编程当中常见的utf编码,相信很多程序员都晕.比如我们最近在做android的NDK编程时,就发

python基础之类的编码风格

自定义工作流程: 一开始应让代码结构尽可能简单.先尽可能在一个文件中完成所有的工作,确定一切都能正确运行后,再将类移动独立的模块中.如果你喜欢模块和文件的交互方式,可在项目开始时就尝试将类存储到模块中.先找出让你能够编写出可行代码的方式,再尝试让代码更为组织有序. 类编码风格: 你必须熟悉有些与类相关的编码风格问题,在你编写的程序较复杂时尤其如此. 类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线.实例名和模块名都采用小写格式,并在单词之间加上下划线. 对于每个类,都应紧

C#时间格式化

有时保存生成的图片,又不想图片名称重复,可以用guid+当前时间, 如: Guid.NewGuid().ToString()+string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now);