首页 技术 正文
技术 2022年11月23日
0 收藏 562 点赞 2,785 浏览 2255 个字
    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
}

微信扫一扫

支付宝扫一扫

本文网址:https://www.zhankr.net/141307.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:875 阅读:4,994
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:806 阅读:3,472
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:565 阅读:4,281
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:730 阅读:4,282
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:4,840
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:3,072
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:8:00-16:00

客服电话

400-888-8888

客服邮箱

ceotheme@ceo.com

扫描二维码

关注微信公众号

扫描二维码

手机访问本站