ID 生成器
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Threading; /// <summary>
/// ID 生成器
/// </summary>
public class IDFactory
{
#region Static Fields /// <summary>
/// The factory.
/// </summary>
private static IDFactory factory; #endregion #region Fields /// <summary>
/// The init millisecond.
/// </summary>
private readonly ulong InitMillisecond; /// <summary>
/// The m watch.
/// </summary>
private readonly Stopwatch mWatch = new Stopwatch(); /// <summary>
/// The m current millisecond.
/// </summary>
private ulong mCurrentMillisecond; /// <summary>
/// The m seed.
/// </summary>
private byte mSeed; #endregion #region Constructors and Destructors /// <summary>
/// Initializes a new instance of the <see cref="IDFactory" /> class.
/// </summary>
public IDFactory()
{
this.InitMillisecond = (ulong)(DateTime.Now - DateTime.Parse("2015-1-1")).TotalMilliseconds;
this.mWatch.Restart();
} static IDFactory()
{
LoadIPGroup();
} #endregion #region Public Properties /// <summary>
/// Gets or sets the group.
/// </summary>
public static byte Group { get; set; } #endregion #region Public Methods and Operators /// <summary>
/// 生成 ID 种子
/// </summary>
/// <returns>返回ID种子。参见<see cref="long" /></returns>
public static long Create()
{
if (factory == null)
{
factory = new IDFactory();
} return (long)factory.Next();
} /// <summary>
/// 获取IP
/// </summary>
public static void LoadIPGroup()
{
string hostName = Dns.GetHostName();
IPAddress[] addressList = Dns.GetHostAddresses(hostName);
foreach (IPAddress ip in addressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{ byte[] data = ip.GetAddressBytes();
uint value = BitConverter.ToUInt32(data, );
value = value << ;
value = value >> ;
Group = (byte)value;
break;
}
}
} /// <summary>
/// 生成ID种子
/// </summary>
/// <returns>
/// The <see cref="ulong" />.
/// </returns>
public ulong Next()
{
ulong result = ;
var slock = new SpinLock();
bool gotLock = false;
try
{
while (!gotLock)
{
slock.Enter(ref gotLock);
if (gotLock)
{
ulong cms = (ulong)this.mWatch.Elapsed.TotalMilliseconds + this.InitMillisecond;
if (cms != this.mCurrentMillisecond)
{
this.mSeed = ;
this.mCurrentMillisecond = cms;
} //result = ((ulong)this.Group << 58) | (this.mCurrentMillisecond << 8) | this.mSeed;
//result = ((ulong)Group << 9) | (this.mCurrentMillisecond << 17) | this.mSeed;
//result = this.mCurrentMillisecond * 1000000 + (ulong)Group * 1000 + this.mSeed;
result = this.mCurrentMillisecond * + (ulong)Group * + this.mSeed;
this.mSeed++;
}
}
}
finally
{
if (gotLock)
{
slock.Exit();
}
} return result;
} #endregion
}
ID 生成器的更多相关文章
- 分布式的Id生成器
项目中需要一个分布式的Id生成器,twitter的Snowflake中这个既简单又高效,网上找的Java版本 package com.cqfc.id; import org.slf4j.Logger; ...
- 分布式ID生成器 zz
简介 这个是根据twitter的snowflake来写的.这里有中文的介绍. 如上图所示,一个64位ID,除了最左边的符号位不用(固定为0,以保证生成的ID都是正数),还剩余63位可用. 下面的代码与 ...
- IOS ID生成器
// // IdGenerator.m // Copyright (c) 2014年 青岛拓宇网络科技有限公司. All rights reserved. // #import "IdGen ...
- 分布式ID生成器
最近会写一篇分布式的ID生成器的文章,先占位.借鉴Mongodb的ObjectId的生成: 4byte时间戳 + 3byte机器标识 + 2byte PID + 3byte自增id 简单代码: imp ...
- 游戏服务器ID生成器组件
游戏服务器程序中,经常需要生成全局的唯一ID号,这个功能很常用,本文将介绍一种通用ID生成组件.游戏服务器程序中使用此组件的场景有: 创建角色时,为其分配唯一ID 创建物品时,每个物品需要唯一ID 创 ...
- ID生成器的一种可扩展实现方案
ID生成器主要为了解决业务程序生成记录ID的场景,而一个好的ID生成器肯定要满足扩展性好.并发性好的特点,本文下面介绍一种满足上述特点的实现方案. 此方案的核心思想是:每次需要扩容机器时,将每个节点维 ...
- ID生成器详解
概述 ID 生成器也叫发号器,它的主要目的就是"为一个分布式系统的数据object产生一个唯一的标识",但其实在一个真实的系统里可能也可以承担更多的作用.概括起来主要有以下几点: ...
- 业务系统需要什么样的ID生成器
业务系统需要什么样的ID生成器 ID 生成器在微博我们一直叫发号器,微博就是用这样的号来存储,而我微博里讨论的时候也都是以发号器为标签.它的主要目的确如平常大家理解的“为一个分布式系统的数据objec ...
- twitter的ID生成器的snowFlake算法的自造版
snowFlake算法在生成ID时特别高效,可参考:https://segmentfault.com/a/1190000011282426 SnowFlake算法生成id的结果是一个64bit大小的整 ...
- snowflake 分布式唯一ID生成器
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 原文参考运维生存和开源中国上的代码整理 我的环境是pytho ...
随机推荐
- 业务开发(八)—— Maven
0x01.maven install成功后,项目旁边依然有个红叉 maven--update--选中下方Force Update of Snapsshots/Releases 0x02.An inte ...
- Python图像处理之验证码识别
在上一篇博客Python图像处理之图片文字识别(OCR)中我们介绍了在Python中如何利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract ...
- 【转载】C#防SQL注入过滤危险字符信息
不过是java开发还是C#开发或者PHP的开发中,都需要关注SQL注入攻击的安全性问题,为了保证客户端提交过来的数据不会产生SQL注入的风险,我们需要对接收的数据进行危险字符过滤来防范SQL注入攻击的 ...
- ASP.NET Core中使用Graylog记录日志
以下基于.NET Core 2.1 定义GrayLog日志记录中间件: 中间件代码: public class GrayLogMiddleware { private readonly Request ...
- word转PDF,PDF转Image,使用oppenOffice注意事项等
最近在电子合同等项目中需要把word或者pdf转换成image,用到了openOffice把word转换pdf,以及把pdf转换成图片 感谢小伙伴张国清花费了三天时间来实现了此功能.下面我将把具体的步 ...
- idea代码提示
idea代码提示:Keymap-->Main menu-->Code-->Completion去掉Cyclic Expand Word的快捷键将Basic的快捷键更改为Alt+/
- Could not open input file: artisan 【Laravel初体验】
1,情景描述:在命令行窗口写入php artisan make:model Models\MenuModel用于创建模型时,出现此错误(Could not open input file: artis ...
- 使用JavaScript获取URL中的参数(两种方法)
本文给大家分享两种方法使用js获取url中的参数,其中方法二是使用的正则表达式方法,大家可以根据需要选择比较好的方法,废话不多说了,直接看详细介绍吧. 方法一: //取url参数 var type = ...
- P2590 [ZJOI2008]树的统计
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- 洛谷P4103 [HEOI2014]大工程(虚树 树形dp)
题意 链接 Sol 虚树. 首先建出虚树,然后直接树形dp就行了. 最大最小值直接维护子树内到该节点的最大值,然后合并两棵子树的时候更新一下答案. 任意两点的路径和可以考虑每条边两边的贡献,\(d[x ...