C# 生成系统唯一号

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

复制代码

public class UniqueNumber

{

    private static long num = 0;//流水号

    private static object lockObj = new object();//锁

 

    /// <summary>

    /// 生成自增长码

    /// </summary>

    /// <returns></returns>

    private static  long GenerateUniqueNumber()

    {

        lock (lockObj)//加锁

        {

            num = num + 1;

            num = (num == 100000 ? 1 : num); //如果大于10W则从零开始,由于一台服务器一秒内不太可能有10W并发,所以yymmddhhmmss+num是唯一号。yymmddhhmmss+num+SystemNo针对多台服务器也是唯一号。

        }

 

        return num;

    }

 

    /// <summary>

    /// 获取唯一码

    /// </summary>

    /// <param name="SystemNo">系统号</param>

    /// <returns>唯一码</returns>

    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;
 
复制代码

 

posted @   zzhi.wang  阅读(3859)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示