高并发下的Id生成器

考虑到sql server以及c#,最多只能用decimal类型,也就是29位的数字,做了下面这个数字型id生成器:

复制代码
class Program
    {
        static void Main(string[] args)
        {
            int i = 100000;
            Timing t = new Timing();

            t.Start();
            while(i-->0)
                UniqueIdGenerator.Next();
            t.Stop();

            t.Display("");
        }
        
    }

    public static class UniqueIdGeneratorHelper
    {
        public static long IP2Long(String strIP)
        {
            long[] ip = new long[4];
            string[] s = strIP.Split('.');
            ip[0] = long.Parse(s[0]);
            ip[1] = long.Parse(s[1]);
            ip[2] = long.Parse(s[2]);
            ip[3] = long.Parse(s[3]);
            return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
        }
    }

    public static class UniqueIdGenerator
    {
        static UniqueIdGenerator()
        {
            ip = UniqueIdGeneratorHelper.IP2Long("192.168.1.21");//需要自己从配置文件中读取
        }

        private static long ip=0;
        public static decimal Next()
        {
            return decimal.Parse(DateTime.Now.ToString("yyyyMMddHHmmssff") + ip.ToString() + GetSequence().ToString());
        }

        private static int curSeq = 1;
        private static object o = 1;
        private static int GetSequence()
        {
            lock (o)
            {
                if (curSeq > 999)
                    curSeq = 1;
                return curSeq++;
            }
        }
    }
复制代码

 

 十万次请求,花了半秒不到,应该还行。

 

 

posted @   McKay  阅读(2256)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示