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. MG--滚动的视觉差效果

    #几句代码完成tableView滚动的视觉差 - 效果图 (失帧严重)![](http://upload-images.jianshu.io/upload_images/1429890-f2c8577 ...

  2. git使用--git命令项目提交问题总结

    提交遇到Error  "remote ref does not exist"解决办法:git fetch -p MY_REMOTE    eg.    git fetch -p o ...

  3. amr转MP3

    using System; using System.Threading; using System.IO; using System.Diagnostics; using System.Securi ...

  4. js高级应用

    特别板块:js跨域请求Tomcat6.tomcat7 跨域设置(包含html5 的CORS) 需要下载两个jar文件,cors-filter-1.7.jar,Java-property-utils-1 ...

  5. rspec中的shared_examples与shared_context有什么不同

    What is the real difference between shared_examples and shared_context ? My observations : I can tes ...

  6. seaJS 简单例子,理解seaJS

    学习心得: 记得第一次学underscore的时候,去的官网(不管什么都是官网好),呼啦一长列语法,我就一个个看,看完也不知道underscore是做什么的.就是现在underscore我也用不上,学 ...

  7. UIScrollView

    1.PPT介绍什么是UIScrollView 2.新建项目“大图片展示” * 尽量用storyboard,减少代码 * 设置contentSize属性 * 取消autolayout * 说明frame ...

  8. 使用html2canvas实现批量生成条形码

    /*前台代码*/ <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Generat ...

  9. 两个list<object> 比较 得到相同数据 差异数据

    package com.lizi.admin.utils.contrast;import java.lang.reflect.InvocationTargetException;import java ...

  10. git ignore

    我最初将整个项目push到远程仓库,但是项目代码里面有大文件,从而传输太费时间了. 看网上的说法,可以通过ignore文件达到不提交某些文件的效果,尝试了一下发现不行. 后来尝试清除缓存 $ git ...