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自增序列/唯一断标识的更多相关文章
- 如何唯一的标识一台Android设备?
UUID : (Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.由以下几部分的组合:当前日期和时间(U ...
- android唯一设备标识、设备号、设备ID的获取方法
##如何获取Android设备唯一ID? ###问题 每一个android设备都有唯一ID吗?如果有?怎么用java最简单取得呢? ###回答1(最佳) 如何取得android唯一码? 好处: 1.不 ...
- UTI 唯一类型标识
本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6657231 applicationdocumentationtypessys ...
- ThreadStatic应用(Identity补完)
关于Identity Identity自增序列/唯一断标识 起初做这个东西,是在一个内部组件中,用于在高并发的环境下得到一个较短的“相对”不重复标识字符串;(这里说的相对是指一定的数量下不重复) 灵感 ...
- Identity
ThreadStatic应用(Identity补完) 关于Identity Identity自增序列/唯一断标识 起初做这个东西,是在一个内部组件中,用于在高并发的环境下得到一个较短的“相对”不重 ...
- 利用IFormattable接口自动参数化Sql语句
提要 string.Format("{0},{1}",a,b)的用法大家都不陌生了,在很多项目中都会发现很多sql语句存在这样拼接的问题,这种做法很多"懒"程序 ...
- iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?
一.UDID (Unique Device Identifier) UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和 ...
- 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz
原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...
- [转]设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识
原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...
随机推荐
- 【java】:通用小知识
1.将String字符串放在最前面 为了防止偶发性的NullPointerException 异常,我们通常将String放置在equals()函数的左边来实现字符串比较,如下代码: // Bad i ...
- 【Java学习笔记】集合转数组---toArray()
package p2; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ...
- STM32 DAC的配置与使用
本博文转自:http://blog.chinaunix.net/uid-24219701-id-4101802.html STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输 ...
- java JFrame修改左上角的图片
直接案例:
- 关于L'Hopital法则
1.首先需要使用 罗尔定理 函数f(x)在闭区间[a,b]连续在开区间(a,b)可微,如果f(a)=f(b),那么至少存在一点c使函数导数f'(c)=0 注意需要再(a,b)可微,如果函数有角点,断点 ...
- Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别
预备知识:SQLServer的IDENTITY关键字IDENTITY关键字代表的是一个函数,而不是identity属性.在access里边没有这个函数,所以在access不能用这个语句.语法:iden ...
- testlink简单部署
CentOS+LAMP+testlink 环境 系统 CentOS6.5 软件 testlink-1.9.14 IP 192.168.0.158 部署 LAMP环境搭建 remi配置 wget htt ...
- DOS tasklist 命令(转)
Dos命令之Tasklist用法及参数函义 2012-10-24 14:44:34| 分类: Windows |字号 订阅 TASKLIST [/S system [/U username [/ ...
- jsp入门笔记
jsp语法 1. declaration 由于访问serlvet只有一个,<%! int i = 0; %> 是servlet的变量,刷新时会不断增加 <% int i = 0; ...
- C#数据结构杂记
定义任何类时记得要定义无参构造函数,否则在反序列化的时候会抛出异常. [Serialize]声明该类可以被序列化 Const与readonly的区别 const本质上是常量没有任何方法修改值,read ...