✅满足的需求:
-
10位数字 - 所有生成的ID都是10位纯数字
-
顺序性 - ID基于时间戳,保证时间上的顺序
-
唯一性 - 通过锁和时间戳+计数器机制保证唯一性
-
线程安全 - 使用锁保证并发安全
-
无外部依赖 - 不依赖数据库、Redis或第三方包
⚠️ 限制和注意事项:
-
每秒最大生成数:最大100个/秒(2位计数器限制)
-
时间范围限制:使用8位时间戳,最多支持约3.17年的唯一ID生成
public class SimpleTenDigitId
{
private static readonly object _lock = new object();
private static long _lastTimestamp = 0;
private static int _counter = 0;
// 起始时间 - 可以自定义
private static readonly DateTime Epoch = new DateTime(2025, 12, 1, 0, 0, 0, DateTimeKind.Utc);
public static string Generate()
{
lock (_lock)
{
var now = DateTime.UtcNow;
// 计算总秒数
var totalSeconds = (long)(now - Epoch).TotalSeconds;
// 取总秒数的后8位(保证在0-99999999范围内)
var timePart = totalSeconds % 100000000;
// 处理时间戳相同的情况
if (totalSeconds == _lastTimestamp)
{
_counter++;
// 如果计数器超过99(2位最大99),等待下一秒
if (_counter > 99)
{
// 等待直到时间戳增加
while (totalSeconds <= _lastTimestamp)
{
Thread.Sleep(10);
now = DateTime.UtcNow;
totalSeconds = (long)(now - Epoch).TotalSeconds;
timePart = totalSeconds % 100000000;
}
_counter = 0;
}
}
else
{
_counter = 0;
_lastTimestamp = totalSeconds;
}
// 返回10位数字:8位时间 + 2位计数器
return $"{timePart:D8}{_counter:D2}";
}
}
}

5427

被折叠的 条评论
为什么被折叠?



