C#实现SQLSERVER数据库中有序GUID生成(NewSequentialId)
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)的更多相关文章
- 针对多类型数据库,集群数据库的有序GUID
一.背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramewor ...
- 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor
批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...
- PowerDesigner从SqlServer数据库中导入实体模型
PowerDesigner从SqlServer数据库中导入实体模型 时间 2013-06-28 10:26:34 CSDN博客 原文 http://blog.csdn.net/sxycxwb/art ...
- 获取sqlserver数据库中所有库、表、字段名的方法
获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...
- 设置SQLServer数据库中某些表为只读的多种方法
原文:设置SQLServer数据库中某些表为只读的多种方法 翻译自:http://www.mssqltips.com/sqlservertip/2711/different-ways-to-make- ...
- 【转载】Sqlserver数据库中无自增Id的情况下使用ROW_NUMBER()函数进行数据分页
在Sqlserver数据库中,如果查询表中含有自增长Id列,一般会采用select Top的方式来数据的分页操作.而实际上很多数据表设计的时候,不一定含有自增长Id列,那么数据库没有Id自增列的时候要 ...
- Sqlserver数据库中的临时表详解
临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考. 临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除.临时表有两种类 ...
- 关于在Java中链接SQLServer数据库中失败的原因分析
首先声明:笔者是Java的初学者,并且一值是走在自学的道路上,长久以来只有“度娘”相伴.(加入了各种Java学习群,基本没有热心帮人解决问题的.可以理解-_-!!!)大神级的人物就不必看拙文了,没有什 ...
- SQLServer数据库中开启CDC导致事务日志空间被占满的原因
SQLServer数据库中开启CDC导致事务日志空间被占满的原因 转载 2017-04-01 投稿:mrr 我要评论 这篇文章主要介绍了SQLServer数据库中开启CDC导致事务日志空间 ...
随机推荐
- angular 自定义filter
用modul.filter .filter("fiilterCity",function(){ return function(obj){ var newObj = []; ang ...
- ESLint系列:ESLint入门安装及简单配置
1.eslint需要依赖node.js环境,在配置之前需要安装好node.js; 2.npm install eslint --save-dev 或 npm install eslint --save ...
- GreenDao教程1
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个框架还是不错的.直接面向对象的,可以通过对对象的操作,实现数据的存储. 但是官网上的API是在不敢恭维,文档写的很糙,看了半天,才搞懂一 ...
- yii框架后台过滤器的使用 安全防护
Yii过滤器简介 过滤器是一段代码,可被配置在控制器动作执行之前或之后执行.例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证:性能过滤器可用于测量控制器执行所用的时间. 一个 ...
- C#,VB.NET如何将Word转换为PDF和Text
众所周知,Word是我们日常工作中常用的办公软件之一,有时出于某种需求我们需要将Word文档转换为PDF以及Text.那么如何以C#,VB.NET编程的方式来实现这一功能呢? 下面我将分开介绍如何运用 ...
- react基于nodejs简单的搭建与开发方法
只需安装babel命令,即可将react的jsx写法转换成浏览器认识的js写法 1.安装nodejs(百度下载安装即可,自带npm) 2.cmd打开命令行,cd进入在自己的文件夹下 执行命令: npm ...
- 十二个 ASP.NET Core 例子
原文地址:http://piotrgankiewicz.com/2017/04/17/asp-net-core-12-samples/ 作者:Piotr Gankiewicz 翻译:杨晓东(Savor ...
- jQuery常用代码片段
检测IE浏览器 在进行CSS设计时,IE浏览器对开发者及设计师而言无疑是个麻烦.尽管IE6的黑暗时代已经过去,IE浏览器家族的人气亦在不断下滑,但我们仍然有必要对其进行检测.当然,以下片段亦可用于检测 ...
- Linux实战教学笔记11:linux定时任务
第十一节 linux定时任务 标签(空格分隔): Linux实战教学笔记 ---更多资料点我查看 1.1 定时任务Crond介绍 Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种 ...
- H5游戏见缝插针开发
中秋节马上就要来临,公司开发了一个h5小游戏叉月饼,其实就是游戏“见缝插针”的翻版.这个游戏的开发任务落到了我的头上... 一 游戏介绍 游戏场景基本如下所示: 二 所用工具 这次的开 ...