自己写的一个主键生成器

数据库主键的选取一直是一个让人比较头疼的问题. 园里子里面的讨论也已经很多了.包括这篇小议数据库主键选取策略(原创) 还有这篇数据库主键设计之思考这两篇都是比较优秀的文章, 基本上对几种选取策取作了一些比较,在此基础之上俺也有了一些粗浅的认识,相较之下,自定义的主键还是一个不错的选择,但是在生成方法上有一些考虑,如并发性问题,所以在”Max+1“和"自制加1"的方案中将相关编号存放于数据库中不是一样太好的方案, 结合这两种方案提供的思路于是乎俺就写了这样一个C#主键发生器:
1. 为了避免线程冲突而采用了单件模式来生成主键,并将上一个主键存放起来,以免生成重复的主键。

2. 字段类型采用定长字符型,如char(20), 生成的字符串前面还可以加上不同的前缀,比如表前缀或者其它一些有意义的标识符.

3. 转化成字母的十六进制类型是为了让最后的长度更小一些.

请大家参考:
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace GB.Core
 6 {
 7     /// <summary>
 8     /// Powered By 沙加, matin0728@gmail.com, QQ5364241
 9     /// </summary>
10     public class IdentityGenerator
11     {
12         static long lastIdentity = 0;
13         static IdentityGenerator o = new IdentityGenerator();
14         public static IdentityGenerator Instance
15         {
16             get
17             {
18                 if (o != null)
19                     return o;
20                 else
21                     return new IdentityGenerator();
22             }
23         }
24         public string NextIdentity()
25         {
26             long idint = DateTime.Now.Ticks - new DateTime(2000111).Ticks;
27 
28             while (lastIdentity >= idint)
29             {
30                 idint++;
31             }
32             lastIdentity = idint;
33 
34             return Convert.ToString(idint, 16);
35         }
36     }
37 }
38 

posted on 2007-11-10 14:58  沙加  阅读(4235)  评论(9编辑  收藏  举报

导航