GUID作为数据库主键由于其无序性所以性能不怎么好,SQL Server中有个函数NewSequentialId可以生成有序的GUID,由于在程序中需要用到,就用C#实现了一下,生成的GUID格式基本和SQL Server一致。

程序代码参考了rpcrt4.dll中UuidCreateSequential的实现。

     public class GuidHelper
{
private static bool initialised;
private static int count; private static long time;
private static long timelast;
private static ushort sequence; private static byte[] address; //网卡MAC
private static readonly object locker = new object();
public static Guid NewSequentialId()
{
lock(locker)
{
if (!initialised)
{
timelast = UuidGetSystemTime();
count = TICKS_PER_CLOCK_TICK;
Random rand = new Random();
sequence = (ushort)(((rand.Next(, ) & 0xFF) << ) + rand.Next(, ) & 0xFF);
sequence &= 0x1FFF;
address = GetAddressBytes();
initialised = true;
}
while (true)
{
time = UuidGetSystemTime();
if (time > timelast)
{
count = ;
break;
}
if (time < timelast)
{
sequence = (ushort)((sequence + ) & 0x1FFF);
count = ;
break;
}
if (count < TICKS_PER_CLOCK_TICK)
{
count++;
break;
}
} timelast = time;
time += count; byte[] guidArray = new byte[]; uint data1 = (uint)(time & 0xffffffff);
ushort data2 = (ushort)((time >> ) & 0xffff);
ushort data3 = (ushort)((time >> ) & 0x0fff);
/* This is a version 1 UUID */
data3 |= ( << ); guidArray[] = (byte)data1;
guidArray[] = (byte)(data1 >> );
guidArray[] = (byte)(data1 >> );
guidArray[] = (byte)(data1 >> );
guidArray[] = (byte)data2;
guidArray[] = (byte)(data2 >> );
guidArray[] = (byte)data3;
guidArray[] = (byte)(data3 >> );
guidArray[] = (byte)(sequence & 0xff);
guidArray[] = (byte)((sequence & 0x3f00) >> );
guidArray[] |= 0x80;
Array.Copy(address, , guidArray, , ); return new Guid(guidArray);
}//locker
}//UuidCreateSequential private static readonly int TICKS_PER_CLOCK_TICK = ;
private static readonly int SECSPERDAY = ;
private static readonly int TICKSPERSEC = ;
private static readonly long SECS_15_OCT_1582_TO_1601 = ( + + + * + ) * SECSPERDAY;
private static readonly long TICKS_15_OCT_1582_TO_1601 = SECS_15_OCT_1582_TO_1601 * TICKSPERSEC;
private static long UuidGetSystemTime()
{
DateTime dt = DateTime.Now;
var ft = dt.ToFileTime();
ft += TICKS_15_OCT_1582_TO_1601;
return ft;
} private static byte[] GetAddressBytes()
{
byte[] bytes;
NetworkInterface[] nic = NetworkInterface.GetAllNetworkInterfaces();
if (nic == null || nic.Length < )
{
bytes = new byte[];
bytes[] = 0x01;
return bytes;
}
bytes = nic[].GetPhysicalAddress().GetAddressBytes();
return bytes;
}
}

代码写的比较粗糙,不过功能已经实现,有需要的朋友可以自行优化!

C#实现SQLSERVER数据库中有序GUID生成(NewSequentialId)的更多相关文章

  1. 针对多类型数据库,集群数据库的有序GUID

    一.背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramewor ...

  2. 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor

    批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...

  3. PowerDesigner从SqlServer数据库中导入实体模型

    PowerDesigner从SqlServer数据库中导入实体模型 时间 2013-06-28 10:26:34 CSDN博客 原文  http://blog.csdn.net/sxycxwb/art ...

  4. 获取sqlserver数据库中所有库、表、字段名的方法

    获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...

  5. 设置SQLServer数据库中某些表为只读的多种方法

    原文:设置SQLServer数据库中某些表为只读的多种方法 翻译自:http://www.mssqltips.com/sqlservertip/2711/different-ways-to-make- ...

  6. 【转载】Sqlserver数据库中无自增Id的情况下使用ROW_NUMBER()函数进行数据分页

    在Sqlserver数据库中,如果查询表中含有自增长Id列,一般会采用select Top的方式来数据的分页操作.而实际上很多数据表设计的时候,不一定含有自增长Id列,那么数据库没有Id自增列的时候要 ...

  7. Sqlserver数据库中的临时表详解

    临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考. 临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除.临时表有两种类 ...

  8. 关于在Java中链接SQLServer数据库中失败的原因分析

    首先声明:笔者是Java的初学者,并且一值是走在自学的道路上,长久以来只有“度娘”相伴.(加入了各种Java学习群,基本没有热心帮人解决问题的.可以理解-_-!!!)大神级的人物就不必看拙文了,没有什 ...

  9. SQLServer数据库中开启CDC导致事务日志空间被占满的原因

    SQLServer数据库中开启CDC导致事务日志空间被占满的原因 转载  2017-04-01   投稿:mrr    我要评论 这篇文章主要介绍了SQLServer数据库中开启CDC导致事务日志空间 ...

随机推荐

  1. kvc模式详解

    java利用反射机制访问类的 私有变量.OC的KVC模式也是一样,用来访问私有变量用的. 用字符串去访问对象实例变量的机制. //KVC模式-(void)KVCtest{ [_dm valueForK ...

  2. Vue 普通对象数据更新与 file 对象数据更新

    最近在做一个多图片上传的组件,需求是做到多文件依次上传,并显示上传进度条. 逻辑部分实现了以后,在更新进度条视图的时候出现一点问题:动态计算生产的进度 progress 属性不会自动更新. 原来的代码 ...

  3. hdu1269强连通分量入门题

    https://vjudge.net/contest/156688#problem 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<= ...

  4. Yeelink初步体验

    环境 Qemu: 2.8.0 开发板:vexpress-ca9   概述     前面的博文已经使我们的虚拟开发板具备了访问外网的目的,离物联网越来越近了.要玩物联网,Yeelink不得不说,它提供了 ...

  5. vector实现最大流EK算法

    序: 在之前的文章中实现了不利用STL实现EK算法,效率也较高.这次我们企图简化代码,减少变量的使用与手写模拟的代码. 注意:vector等STL的container在不开O2优化的时候实现同一个效果 ...

  6. copyWithZone 的使用方法

    1.简单复制只能实现浅拷贝:指针赋值,使两个指针指向相同的一块内存空间,操作不安全. 2. Foundation类已经遵守了<NSCopying>和 <NSMutableCopyin ...

  7. php表单提交 图片、音乐、视频、文字,四种类型共同提交到数据库

    这个问题一直困扰了我好几天,终于在今天让我给解决了,难以掩饰的激动. 其实在之前没有接触到这种问题,只是表单提交数据而已,再就是图片,四种类型同时提交还真是没遇到过,做了一个系统,其中有一个功能就是提 ...

  8. 学习MVC之租房网站(七)-房源管理和配图上传

    在上一篇<学习MVC之租房网站(六)-用户登录和权限控制>完成了后台用户登录和权限控制功能的开发,接下来要完成的是房源的管理,用户在后台新增.编辑房源信息,供前台用户操作. 一 房源管理 ...

  9. Visual Studio 2013 IIS Express使用域名调试mvc程序

    1.编辑applicationhost.config文件 启动vs2013,在右下角IIS Express图标中右击,显示如图,点击框中菜单. 找到你的启动项,点击1,然后点击2,这是应该会有编辑器打 ...

  10. [笔记]我的Linux入门之路 - 05.Eclipse的Python开发环境搭建与Numpy、Scipy库安装

    一.Python环境 直接终端查询下python安装没:python --version Python 2.7.12 Ubuntu竟然已经装了Python2.7,那就好说了.不然自己装和装jdk差不多 ...