首页 > C# 生成系统唯一号

C# 生成系统唯一号

生成唯一号:思路,根据yymmddhhmmss+自增长号+唯一服务器号( SystemNo)生成唯一码,总长度19,例如:1509281204550000101.

 
public class UniqueNumber
 
{
 
    private static long num = 0;//流水号
 
    private static object lockObj = new object();//锁
 
 
    ///
 
    /// 生成自增长码
 
    ///
 
    ///
 
    private static  long GenerateUniqueNumber()
 
    {
 
        lock (lockObj)//加锁
 
        {
 
            num = num + 1;
 
            num = (num == 100000 ? 1 : num); //如果大于10W则从零开始,由于一台服务器一秒内不太可能有10W并发,所以yymmddhhmmss+num是唯一号。yymmddhhmmss+num+SystemNo针对多台服务器也是唯一号。
 
        }
 
 
        return num;
 
    }
 
 
    ///
 
    /// 获取唯一码
 
    ///
 
    /// 系统号
 
    /// 唯一码
 
    public static long GetUniqueNumber(int SystemNo)
 
    {
 
        if (SystemNo > 99 || SystemNo < 1)
 
        {
 
            throw new Exception("系统号有误");
 
        }
 
 
        lock (lockObj)// 要使静态变量多并发下同步,需要两次加锁。
 
        {
 
            string time = DateTime.Now.ToString("yyMMddHHmmss");//12位;
 
            return long.Parse(time + GenerateUniqueNumber().ToString().PadLeft(5, '0') + SystemNo.ToString().PadLeft(2, '0'));//19位
 
        }
 
    }
 
}
 

测试:

static void Main(string[] args)
      {
          for (int i = 1; i < 98; i++)//N个线程
          {
              Thread thread = new Thread(new ParameterizedThreadStart(Exe));
              thread.Start(i);
          }
      }
      public static void Exe(object sysNo)
      {
          for (int i = 0; i < 1000; i++)//M次循环执行
          {
              long v = UniqueNumber.GetUniqueNumber((int)sysNo);
              DbHelperMySQL.ExecuteSql(" insert into abacus.guidtest (val) values ('" + v + "');");
          }
      }


mySQl脚本:



SELECT FROM abacus.guidtest;
 
select count(id) from abacus.guidtest;
 
select val from abacus.guidtest
 
group by val
 
having count(val) >1;
 
truncate table abacus.guidtest;
 
 
CREATE TABLE `guidtest`
 
  `id` int(11) NOT NULL AUTO_INCREMENT,
 
  `val` bigint(20) NOT NULL,
 
  PRIMARY KEY (`id`),
 
  UNIQUE KEY `id_UNIQUE` (`id`)
 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 

 

转载于:https://www.cnblogs.com/zhangzhi19861216/p/4839813.html

更多相关:

  • 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 注意: num 的长度小于 10002 且 ≥ k。 num 不会包含任何前导零。 示例 1 : 输入: num = “1432219”, k = 3 输出: “1219” 解释: 移除掉三个数字 4, 3, 和 2形成一个新的最小的数...

  • 代码展示:   http://paste.ubuntu.com/23693598/ #include #include #include char * largeDiffer(char *a,char *b){ /*  使用说明 传入的a和b只能为整数 结果为a-b;返回...

  • Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of Ch...

  • /*Name: NYOJ--811--变态最大值Author: shen_渊 Date: 17/04/17 15:49Description: 看到博客上这道题浏览量最高,原来的代码就看不下去了 o(╯□╰)o */#include #include #include u...

  • jdt可以做语法树分析,并且支持visitor模式对代码进行分析。跟pmd的分析方式一样,我们只要实现 visitor接口即可实现一个插件。 @Service("requestMappingInfoService")public class RequestMappingInfoServiceImpl implements Reques...

  • 1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法。  (2)它们只能访问static数据。 (3)它们不能以任何方式引用this 或super。 class Simple {static v...

  • 类的静态构造函数也叫类型构造器,静态构造器,他调用的时刻由CLR来控制:CLR会选择如下时间之一来调用静态构造函数:      1,在类型的第一个实例创建之前,或类型的非继承字段或成员第一次访问之前。这里的“之前”,代表前后衔接的意思。这里的时刻是精确的!      2,在非继承的静态字段或成员第一次访问之前的某个时刻,具体时刻不定!...

  • 2019独角兽企业重金招聘Python工程师标准>>> django的settings中包含三个static相关设置项: STATIC_ROOT STATIC_URL STATICFILES_DIRS STATIC_URL 好理解,就是映射到静态文件的url,一般为/static/ STATICFILES...

  • #-*- coding: utf-8 -*-from skimage importio,transformimportglobimportosimporttensorflow as tfimportnumpy as npimporttimepath='D:/code/python/Anaconda3/envs/faces'#将所有的图...