Sequential GUID in Linq-to-Sql?

后端 未结 6 1885
忘掉有多难
忘掉有多难 2020-11-28 23:39

I just read a blog post about NHibernate\'s ability to create a GUID from the system time (Guid.Comb), thus avoiding a good amount of database fragmentation. You could call

6条回答
  •  半阙折子戏
    2020-11-29 00:08

    C# (safe) code (Compliments of the NHibernate Guid Comb Generator)

    Guid GenerateComb()
    {
        byte[] destinationArray = Guid.NewGuid().ToByteArray();
        DateTime time = new DateTime(0x76c, 1, 1);
        DateTime now = DateTime.Now;
        TimeSpan span = new TimeSpan(now.Ticks - time.Ticks);
        TimeSpan timeOfDay = now.TimeOfDay;
        byte[] bytes = BitConverter.GetBytes(span.Days);
        byte[] array = BitConverter.GetBytes((long) (timeOfDay.TotalMilliseconds / 3.333333));
        Array.Reverse(bytes);
        Array.Reverse(array);
        Array.Copy(bytes, bytes.Length - 2, destinationArray, destinationArray.Length - 6, 2);
        Array.Copy(array, array.Length - 4, destinationArray, destinationArray.Length - 4, 4);
        return new Guid(destinationArray);
    }
    

    A link to the source on github: https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Id/GuidCombGenerator.cs

提交回复
热议问题