高并发下的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 @ 2013-12-06 17:05  McKay  阅读(2243)  评论(2编辑  收藏  举报