ThreadStatic应用(Identity补完)

用于在高并发环境中的自增序列维护和快速创建唯一不重复的短标识,该类是线程安全的

如在ORM组件中,创建唯一的参数名

特点:

高并发环境下的性能保证

创建的唯一标识较短且在一定条件下绝不重复

在特定环境中实用价值较高

缺点:

有上限限制,短时间内并发超过上限则会出现重复,理论上限值ulong.MaxValue,不过建议不要设置过高

/// <summary> 自增序列,最大0xFFFFFFF,超过0xFFFFFFF回归1
/// </summary>
public static class Identity
{
static volatile int _id = ;
/// <summary> 当前值
/// </summary>
public static int Current
{
get { return Identity._id; }
}
/// <summary> 获取一个id,每获取一次就会自增1,该方法在所有线程都是安全的
/// </summary>
public static int Next()
{
int i = System.Threading.Interlocked.Increment(ref _id);
if (i > (0xFFFFFFF))
{
i = i - 0xFFFFFFF;
System.Threading.Interlocked.Exchange(ref _id, i);
}
return i;
} //字符字典
static char[] _CharMap = new[]
{
'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
}; /// <summary> 获取一个id的String表示形式,每获取一次就会自增1,该方法在所有线程都是安全的
/// </summary>
public static string NextString()
{
int number = Next();
int length = (int)Math.Log(number, ) + ;//52比较合理,不要改了
char[] c = new char[length + ];
c[length] = '';
for (int i = length - ; i > ; i--)
{
c[i] = _CharMap[number % ];
number = number / ;
}
c[] = _CharMap[number];
return new string(c);
}
}

代码中的初始值是从0开始的. 为了方便看效果,我修改初始值,为0xFFFFFFC

            Console.Write("初始值:");
Console.WriteLine(Identity.Current);
Console.WriteLine("==== 数字 ====");
Console.WriteLine(Identity.Next());
Console.WriteLine(Identity.Next());
Console.WriteLine(Identity.Next());
Console.WriteLine(Identity.Next());
Console.WriteLine(Identity.Next());
Console.WriteLine(Identity.Next());
Console.WriteLine(Identity.Next());
初始值:
==== 数字 ====

这里也修改了初始值

            Console.Write("初始值:");
Console.WriteLine(Identity.Current);
Console.WriteLine("==== 字符 ====");
for (int i = ; i < ; i++)
{
Console.Write(Identity.NextString());
Console.Write("\t当前值:");
Console.WriteLine(Identity.Current);
}

初始值:268423164
==== 字符 ====
KLaVX0 当前值:268423165
KLaVY0 当前值:268423166
KLaVZ0 当前值:268423167
KLaWa0 当前值:268423168
KLaWb0 当前值:268423169
KLaWc0 当前值:268423170
KLaWd0 当前值:268423171
KLaWe0 当前值:268423172
KLaWf0 当前值:268423173
KLaWg0 当前值:268423174
KLaWh0 当前值:268423175
KLaWi0 当前值:268423176
KLaWj0 当前值:268423177
KLaWk0 当前值:268423178
KLaWl0 当前值:268423179
KLaWm0 当前值:268423180
KLaWn0 当前值:268423181
KLaWo0 当前值:268423182
KLaWp0 当前值:268423183
KLaWq0 当前值:268423184

 https://code.csdn.net/snippets/104950

Identity自增序列/唯一断标识的更多相关文章

  1. 如何唯一的标识一台Android设备?

    UUID : (Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.由以下几部分的组合:当前日期和时间(U ...

  2. android唯一设备标识、设备号、设备ID的获取方法

    ##如何获取Android设备唯一ID? ###问题 每一个android设备都有唯一ID吗?如果有?怎么用java最简单取得呢? ###回答1(最佳) 如何取得android唯一码? 好处: 1.不 ...

  3. UTI 唯一类型标识

    本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6657231   applicationdocumentationtypessys ...

  4. ThreadStatic应用(Identity补完)

    关于Identity Identity自增序列/唯一断标识 起初做这个东西,是在一个内部组件中,用于在高并发的环境下得到一个较短的“相对”不重复标识字符串;(这里说的相对是指一定的数量下不重复) 灵感 ...

  5. Identity

    ThreadStatic应用(Identity补完)   关于Identity Identity自增序列/唯一断标识 起初做这个东西,是在一个内部组件中,用于在高并发的环境下得到一个较短的“相对”不重 ...

  6. 利用IFormattable接口自动参数化Sql语句

    提要 string.Format("{0},{1}",a,b)的用法大家都不陌生了,在很多项目中都会发现很多sql语句存在这样拼接的问题,这种做法很多"懒"程序 ...

  7. iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?

    一.UDID (Unique Device Identifier) UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和 ...

  8. 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz

    原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...

  9. [转]设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识

    原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...

随机推荐

  1. sql sever获取数据库还原时间语句

    --只获取数据库名称和最后的还原时间 SELECT sdb.Name AS DatabaseName , ), ), '-') AS LastBackUpTime FROM sys.sysdataba ...

  2. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  3. ORACLE 自动增长通过封装函数,方便调用

    好的编程习惯,是一个很有必要的过程.好的编程习惯,可以因人而异,但是简单地.基本地代码级别的就那些:写注释.合理的缩进.换行.变量命名等. 对我们程序员来说,大部分时间都对着电脑,在对着电脑的大部分时 ...

  4. mysql数据表操作&库操作

    首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...

  5. VS非web项目使用Transformation配置文件

    Web项目中的Transformation使用起来非常方便,特别是本地与服务器情况不一致时调试下以及webdeploy的配合使用. 步骤: 1. 在项目中新建App.Debug.Config及App. ...

  6. Cocostudio 文章列表

    Cocostudio 文章列表 Cocostudio(1) 容器层的使用- ScrollView ListView PageViewhttp://www.cnblogs.com/TS-qrt/arti ...

  7. 微信小程序免费SSL证书https、TLS版本问题的解决方案

    微信小程序与第三方服务器通讯的域名5个必要条件1.一个已备案的域名,不是localhost.也不是127.0.0.1,域名不能加端口2.加ssl证书,也就是https://~~~4.HTTPS 服务器 ...

  8. AsyncOperation变成同步的代码

    template <typename TResult> TResult PerformSynchronously(Windows::Foundation::IAsyncOperation& ...

  9. Python成长笔记 - 基础篇 (九)

    创建一个socketserver 至少分以下几步: First, you must create a request handler class by subclassing the BaseRequ ...

  10. windows编程:第一个windows程序

    #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <math ...