Browse Source

修正雪花id机器码非法的问题

懒得勤快 2 years ago
parent
commit
0f1ba43439

+ 1 - 1
Masuit.Tools.Abstractions/Masuit.Tools.Abstractions.csproj

@@ -3,7 +3,7 @@
         <TargetFrameworks>netstandard2.0;netstandard2.1;net461;net5;net6;net7</TargetFrameworks>
         <LangVersion>latest</LangVersion>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-        <Version>2.6.6.4</Version>
+        <Version>2.6.6.5</Version>
         <Authors>懒得勤快</Authors>
         <Description>新手友好的C#万能工具库,码数吐司库,Masuit.Tools基础公共库(适用于.NET4.6.1/.NET Standard2.0及以上项目),包含一些常用的操作类,大都是静态类,加密解密,反射操作,Excel简单导出,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期时间扩展操作,中国农历,大文件拷贝,图像裁剪,验证码,断点续传,集合扩展等常用封装。
             官网教程:https://tools.masuit.org

+ 12 - 2
Masuit.Tools.Abstractions/Systems/SnowFlake.cs

@@ -13,6 +13,7 @@ namespace Masuit.Tools.Systems
 	{
 		#region 私有字段
 
+		private static long Offset = 0L; //起始偏移量
 		private static long _machineId; //机器码
 		private static long _sequence; //计数从零开始
 		private static long _lastTimestamp = -1L; //最后时间戳
@@ -57,7 +58,7 @@ namespace Masuit.Tools.Systems
 		public SnowFlake()
 		{
 			var bytes = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault().GetPhysicalAddress().GetAddressBytes();
-			Snowflakes(bytes[4] << 4 | bytes[5]);
+			Snowflakes(bytes[4] << 2 | bytes[5]);
 		}
 
 		/// <summary>
@@ -91,6 +92,15 @@ namespace Masuit.Tools.Systems
 			_numberFormater = nf;
 		}
 
+		/// <summary>
+		/// 设置起始偏移量
+		/// </summary>
+		/// <param name="offset"></param>
+		public static void SetInitialOffset(long offset)
+		{
+			Offset = offset;
+		}
+
 		/// <summary>
 		/// 获取长整形的ID
 		/// </summary>
@@ -118,7 +128,7 @@ namespace Masuit.Tools.Systems
 
 				_lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
 				long id = ((timestamp - Twepoch) << (int)TimestampLeft) | (_machineId << MachineLeft) | _sequence;
-				return id;
+				return id - Offset;
 			}
 		}
 

+ 21 - 3
Masuit.Tools.Abstractions/Systems/SnowFlakeNew.cs

@@ -13,6 +13,7 @@ public class SnowFlakeNew
 {
 	private readonly long _workerId; //机器ID
 	private const long Twepoch = 1692079923000L; //唯一时间随机量
+	private static long Offset = 7783685984256L; //起始偏移量
 	private static long _sequence;
 	private const int SequenceBits = 12; //计数器字节数,10个字节用来保存计数码
 	private const long SequenceMask = -1L ^ -1L << SequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成
@@ -46,7 +47,7 @@ public class SnowFlakeNew
 	public SnowFlakeNew()
 	{
 		var bytes = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault().GetPhysicalAddress().GetAddressBytes();
-		_workerId = bytes[4] << 4 | bytes[5];
+		_workerId = bytes[4] << 2 | bytes[5];
 	}
 
 	/// <summary>
@@ -55,7 +56,24 @@ public class SnowFlakeNew
 	/// <param name="machineId">机器码</param>
 	public SnowFlakeNew(int machineId)
 	{
-		_workerId = machineId;
+		if (machineId >= 0)
+		{
+			if (machineId > 1024)
+			{
+				throw new Exception("机器码ID非法");
+			}
+
+			_workerId = machineId;
+		}
+	}
+
+	/// <summary>
+	/// 设置起始偏移量
+	/// </summary>
+	/// <param name="offset"></param>
+	public static void SetInitialOffset(long offset)
+	{
+		Offset = offset;
 	}
 
 	/// <summary>
@@ -95,7 +113,7 @@ public class SnowFlakeNew
 				throw new Exception($"Clock moved backwards.  Refusing to generate id for {_lastTimestamp - timestamp} milliseconds");
 			}
 			_lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
-			return _workerId << 52 | (timestamp - Twepoch << 12) | _sequence;
+			return (_workerId << 52 | (timestamp - Twepoch << 12) | _sequence) - Offset;
 		}
 	}
 

+ 1 - 1
Masuit.Tools.AspNetCore/Masuit.Tools.AspNetCore.csproj

@@ -18,7 +18,7 @@
         <Product>Masuit.Tools.AspNetCore</Product>
         <PackageId>Masuit.Tools.AspNetCore</PackageId>
         <LangVersion>latest</LangVersion>
-        <Version>1.2.6.6</Version>
+        <Version>1.2.6.7</Version>
         <RepositoryType></RepositoryType>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
         <FileVersion>1.1.9</FileVersion>

+ 1 - 1
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -6,7 +6,7 @@
 官网教程:https://tools.masuit.org
 github:https://github.com/ldqk/Masuit.Tools
         </Description>
-        <Version>2.6.6.4</Version>
+        <Version>2.6.6.5</Version>
         <Copyright>Copyright © 懒得勤快</Copyright>
         <PackageProjectUrl>https://github.com/ldqk/Masuit.Tools</PackageProjectUrl>
         <PackageTags>Masuit.Tools,工具库,Utility,Crypt,Extensions</PackageTags>

+ 1 - 1
Test/Masuit.Tools.Test/Masuit.Tools.Test.csproj

@@ -9,7 +9,7 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>Masuit.Tools.Test</RootNamespace>
     <AssemblyName>Masuit.Tools.Test</AssemblyName>
-    <TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>

+ 1 - 1
Test/Masuit.Tools.Test/app.config

@@ -36,4 +36,4 @@
       </dependentAssembly>
     </assemblyBinding>
   </runtime>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1"/></startup></configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>