0%

快速顺序ID池

概论

一个ID池应该包含以下操作

  • 注册ID
  • 注销ID
  • 查询某ID是否已经被注册

实现

该文所有代码来自朋友的Ordinary库 链接在文末

1
2
private List<uint> unuseds = new List<uint>();
public uint Newest { get; private set; }

unused是被注册后注销的ID
NewsetId就是字面意思

初始化

自行设置Newest作为ID的起点

注册ID

如果unused非空 则把一ID从中删除并返回

否则返回Newest++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public uint Rent()
{
if (unuseds.Count == 0)
{
return Newest++;
}
else
{
var i = unuseds.Count - 1;
var v = unuseds[i];
unuseds.RemoveAt(i);
return v;
}
}

注销ID

仅需把该ID加入unused

1
2
3
4
5
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Return(uint id)
{
unuseds.Add(id);
}

查询

如果该ID大于Newest 则显然没注册过

否则在unused中查找 如果找到了 那就没注册过(注册后注销了)

不然就是注册过

1
2
3
4
5
6
7
8
9
10
11
12
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool IsUsed(uint id)
{
if (id >= Newest)
{
return false;
}
else
{
return !unuseds.Contains(id);
}
}

总结

该ID池适合大量注册少量注销 或是注册注销很均匀的情况

如果大量注册后大量注销 内存开销会很大

朋友的库 有很多实用功能 C#写的 链接