chiname

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

不再使用自动编号了。自己写了一个Id生成器,超级简单

帮一个朋友导数据时就发生自动编号的主键发生重复,花了我大半天的时间。累死了。给他们写了一个小工具,生成时间戳的代码:

public class IdentityGenerator{
    
private static Random random;
    
public static long GetIdentity(){
        
long id = (DateTime.Now.Ticks-(new DateTime(2000,1,1,0,0,0)))/1000000;//1000000精确到秒,要更精确,比如到100毫秒可再减少数字
        if(random!=null)
            random 
=  new Random();

       id 
= id * 1000 + random.Next(0,1000);//取3位随机数
       return id;
    }

}
经过一个压力测试:可以保证1秒钟至少生成1000个Id不重复。代码仅作参考。这里我没有检查正确性。仅仅例子而已。真实的代码大概有这个的三四倍吧。


使用方法:
直接调用IdentityGenerator.GetIdentity()

如果使用数据实体的化可以设计一个基类
 1 public class BaseData{
 2     private long _identity;
 3     public class BaseData(){
 4         this._identity = IdentityGenerator.GetIdentity();
 5     }
 6     //继承后在实体中定义其属性名,返回 或设置该值,如果名字相同可以将其改为public
 7     protected long Identity{
 8         get{return this._identity;}
 9         set{
10             if(this._identity!=value)
11                 this._identity = value;
12         }
13     }
14     //重新设置Id
15     public void ResetIdentity(){
16         this._identity = IdentityGenerator.GetIdentity();
17     }
18 
19 }


简单才好!
优点:使用bigint型字段、比Guid好看些,大范围内是按顺序排列的,基本不会在前面的序列插入,短时间内(1秒钟)可能有无序产生,不过影响不是太大。简单省事
缺点:仍然存在重复的可能性,对于并发处理量超大的请仔细斟酌再三考虑。

仍然有人批评生成的3214578921之类的id太难看了,而且长:(
我想对于在浏览器上靠猜测
view.aspx?id=124下一个帖子125是什么的人可能不管用了,因为相邻两个id间距不等,至少也有好几千的:)可以起到 一个保护性作用吧。

裸机里面用记事本敲代码真麻烦,到此为止吧。

Feedback

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-30 14:54 by Sadly_Lee
不錯,剛好要用到

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-30 15:04 by 蛙蛙池塘
http://onlytiancai.cnblogs.com/archive/2005/07/28/201842.html

偶这里整理了一些随机数的讨论。如果是用作企业应用的标识的话,应该有一套规则,像身份证号一样,有部分代表区域,有部分代表生日,有部分代表性别等。产品的话就千几位代表大分类,后几位代表小分类,然后再后几位随机序号。纯粹的不重复的标识,用GUID就行。

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-30 15:10 by 浪淘沙
活活,看了。不过我这个没那么复杂。仅仅做数据库的标识,是给电脑看的。:)

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-30 15:12 by 飞动了
如果只是为了产生不重复的编号,为什么不用GUID?

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-30 15:16 by 浪淘沙
Guid也是一个选择,这里只是再提供一个方法。毕竟也有不喜欢Guid那么长串的复杂咚咚。
很多人还是喜欢数字的。

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-30 17:55 by 听棠.NET
我的文章中也提到了这种方式的缺点,就是如何要进行系统集成就麻烦了。
http://tintown.cnblogs.com/archive/2005/03/02/111459.aspx

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-30 21:46 by qoo.net
应该会有并发的问题存在吧

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-30 22:51 by 听棠.NET
对于并发问题,楼主可以使用lock{}来做!!

# re: 不再使用自动编号了。自己写了一个Id生成器,超级简单   

2005-08-31 00:50 by 刘飒
最近搞什么呢?
posted on 2005-08-31 09:10  把我的欢乐带给你  阅读(554)  评论(0)    收藏  举报