生成分布式随机ID
经测试,最快的一种
public class Generator
{
// should be between 40 (34 years) and 42 (139 years)
internal const int NumberOfTimeBits = ; // should be between 0 (single generator) and 10 (1024 generators)
internal const int NumberOfGeneratorIdBits = ; // should be 10 at least (4096 unique ids per millisecond per generator)
internal const int NumberOfSequenceBits = - NumberOfTimeBits - NumberOfGeneratorIdBits; private readonly byte[] _buffer = new byte[];
private readonly byte[] _timeBytes = new byte[];
private readonly byte[] _idBytes = new byte[];
private readonly byte[] _sequenceBytes = new byte[];
private readonly int _maxSequence = (int)Math.Pow(, NumberOfSequenceBits) - ;
private readonly DateTime _start; private short _sequence;
private long _previousTime; /// <summary>
/// Instantiate the generator. Each Generator should have its own ID, so you can
/// use multiple Generator instances in a cluster. All generated IDs are unique
/// provided the start date newer changes. I recommend to choose January 1, 2013.
/// </summary>
public Generator(short generatorId, DateTime start)
{
if (generatorId < || generatorId >= Math.Pow(, NumberOfGeneratorIdBits))
{
var msg = string.Format(
CultureInfo.InvariantCulture,
"generator id must be between 0 (inclusive) and {0} (exclusive).",
Math.Pow(, NumberOfGeneratorIdBits));
throw new ArgumentException(msg, "generatorId");
}
if (start > DateTime.Today)
{
throw new ArgumentException("start date must not be in the future.", "start");
} CalculateIdBytes(generatorId);
_start = start;
} /// <summary>
/// Can generate up to 4096 different IDs per millisecond.
/// </summary>
public string Next()
{
SpinToNextSequence();
WriteValuesToByteArray(_buffer, _previousTime, _sequence); //return DateTime.Now.ToString("yyyyMMddHH")+Convert.ToBase64String(_buffer); 这样有更好的排序
return Convert.ToBase64String(_buffer);
} public ulong NextLong()
{
SpinToNextSequence();
WriteValuesToByteArray(_buffer, _previousTime, _sequence); Array.Reverse(_buffer);
return BitConverter.ToUInt64(_buffer, );
} internal unsafe void WriteValuesToByteArray(byte[] target, long time, short sequence)
{
fixed (byte* arrayPointer = target)
{
*(long*)arrayPointer = ;
} fixed (byte* arrayPointer = _timeBytes)
{
*(long*)arrayPointer = time << ( - NumberOfTimeBits);
} fixed (byte* arrayPointer = _sequenceBytes)
{
*(short*)arrayPointer = sequence;
} WriteValuesToByteArray(target, _timeBytes, _idBytes, _sequenceBytes);
} private unsafe void CalculateIdBytes(short id)
{
fixed (byte* arrayPointer = _idBytes)
{
*(short*)arrayPointer = (short)(id << ( - (( - NumberOfSequenceBits) % )));
}
} [MethodImpl(MethodImplOptions.AggressiveInlining)]
private void WriteValuesToByteArray(byte[] target, byte[] time, byte[] id, byte[] sequence)
{
//// 1234567890123456789012
//// time: 1111111111111111111111111111111111111111110000
//// id: 0011111111110000
//// seq: 0000111111111111
////
//// 000000000000000100010111101010100001000010 0000001011 000000000000
//// pos: 0 1 2 3 4 5 6
//// byte: 0 1 2 3 4 5 6 7 target[] = (byte)(target[] | time[]);
target[] = (byte)(target[] | time[]);
target[] = (byte)(target[] | time[]);
target[] = (byte)(target[] | time[]);
target[] = (byte)(target[] | time[]);
target[] = (byte)(target[] | time[]);
target[] = (byte)(target[] | time[]);
target[] = (byte)(target[] | time[]); target[] = (byte)(target[] | id[]);
target[] = (byte)(target[] | id[]); target[] = (byte)(target[] | sequence[]);
target[] = (byte)(target[] | sequence[]);
} private void SpinToNextSequence()
{
var time = GetTime(); while (time == _previousTime && _sequence >= _maxSequence)
{
time = GetTime();
} _sequence = time == _previousTime ? (short)(_sequence + ) : (short);
_previousTime = time;
} [MethodImpl(MethodImplOptions.AggressiveInlining)]
private long GetTime()
{
return (long)(DateTime.UtcNow - _start).TotalMilliseconds;
}
}
gihub地址:https://github.com/mschuler/UniqueIdGenerator
生成分布式随机ID的更多相关文章
- 雪花算法,生成分布式唯一ID
2.3 基于算法实现 [转载] 这里介绍下Twitter的Snowflake算法——snowflake,它把时间戳,工作机器id,序列号组合在一起,以保证在分布式系统中唯一性和自增性. snowfla ...
- 高并发情况下,如何生成分布式全局id
1.使用UUID生成全局id,不占用宽带 2.基于数据库自增或者序列生成全局id,占用宽带,设置自增步长实现集群,但可扩展性差 3.基于redis生成全局id,占用宽度,设置自增步长实现集群,性能比数 ...
- Zookeeper命名服务——生成分布式有序且唯一id
生成分布式有序且唯一id的方法有很多种,使用zookeeper是比较简单的一种方法,只是生成的速度不高,这里只是一个借助zk的版本号生成分布式唯一且有序id的例子. ZkIdGenerator.jav ...
- 高并发情况下分布式全局ID
1.高并发情况下,生成分布式全局id策略2.利用全球唯一UUID生成订单号优缺点3.基于数据库自增或者序列生成订单号4.数据库集群如何考虑数据库自增唯一性5.基于Redis生成生成全局id策略6.Tw ...
- 分布式唯一id:snowflake算法思考
匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...
- 分布式Unique ID的生成方法
分布式Unique ID的生成方法 分布式的Unique ID的用途如此广泛,从业务对象Id到日志的TraceId,本文总结了林林总总的各种生成算法. 1. 发号器 我接触的最早的Unique ID, ...
- [转帖]分布式Unique ID的生成方法一览
分布式Unique ID的生成方法一览 http://www.importnew.com/22211.html 分布式的Unique ID的用途如此广泛,从业务对象Id到日志的TraceId,本文总结 ...
- 分布式全局ID生成方案
传统的单体架构的时候,我们基本是单库然后业务单表的结构.每个业务表的ID一般我们都是从1增,通过AUTO_INCREMENT=1设置自增起始值,但是在分布式服务架构模式下分库分表的设计,使得多个库或多 ...
- 分布式全局ID的几种生成方案
前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等. 那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是 ...
随机推荐
- 8148之更换摄像头出现异常---REISZER OVERFLOW OCCURED: RESTARTING
my iss config as: rsz_reg->SRC_VSZ = 1079;//715; rsz_reg->SRC_HSZ = 1919;//1277; rszA_reg ...
- php生成唯一的串
1.方法一: <?php md5(uniqid('aa',true)); ?> 2.方法2: //生成16位的串$randLength=6; $chars='abcdefghijklmno ...
- sql 时间转换格式
convert(varchar(10),字段名,转换格式) CONVERT(nvarchar(10),count_time,121)CONVERT为日期转换函数,一般就是在时间类型(datetime, ...
- python 基础 1.5 python数据类型(三)--元组常用方法示例
#/usr/bin/python#coding=utf-8#@Time :2017/10/13 15:02#@Auther :liuzhenchuan#@File :元组.py #tuple() 字符 ...
- 【BZOJ1336】[Balkan2002]Alien最小圆覆盖 随机增量法
[BZOJ1336][Balkan2002]Alien最小圆覆盖 Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=10000 ...
- 认识影片版本(CAM、TS、TC、DVD、HD、BD、TVRIP等)
许多朋友在下载电影的时候, 往往会被各种各样的版本标识弄糊涂,今天把各种版本的缩写收集在一起,希望对大家有所帮助 . 引用: 1.CAM(枪版) CAM 通常是用数码摄像机从电影院盗录.有时会使 ...
- Hadoop基础学习(一)分析、编写并执行WordCount词频统计程序
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jiq408694711/article/details/34181439 前面已经在我的Ubuntu ...
- linux日志系统介绍 —— syslog(),openlog(),closelog()
函数使用介绍 这里面的三个函数openlog, syslog.closelog是一套系统日志写入接口.另外那个vsyslog和syslog功能一样,仅仅是參数格式不同. 通常.sysl ...
- Light OJ 1005 - Rooks 数学题解
版权声明:本文作者靖心.靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- linux内核 RCU机制详解【转】
本文转载自:https://blog.csdn.net/xabc3000/article/details/15335131 简介 RCU(Read-Copy Update)是数据同步的一种方式,在当前 ...