id 分配工具箱
提供三种互补的 id 分配机制,按需求选用:
| 类型 | 机制 | 用途 | 号的形态 |
|---|---|---|---|
[monotonic::IdGen] |
单调递增 AtomicU64 |
全局对象身份(koid) | 稀疏大整数、永不复用、ABA 免疫、无锁 |
[dense::IdAllocator] |
回收位图 | 小而密的可复用号(pid) | 最小空闲优先、自动增长、可复用 |
[table::IdTable] |
世代槽位表 | 号↔对象表(handle) | 密集索引 + generation 防 ABA、O(1) |
选择要点:
- 只需要一个永不重复的标识(对外暴露、做比较或 map key)→ [
monotonic::IdGen], 机制最简、从根上免疫复用问题,64 位空间实际不可能耗尽。 - 需要小而密、可读、可回收的号(典型如 pid)→ [
dense::IdAllocator]。 - 需要按号存取对象且担心裸号被缓存后复用指向错对象 → [
table::IdTable], id 自带 generation,旧号在查找时被拒。