32 位 handle 的一种生成方法
我倾向于在 C 程序里使用整数 handle ,而不是指针。尤其是需要做弱引用的时候。
我认为,一个好的 handle 生成算法,应该满足:
- 即使 handle 被销毁了,它这个数字也应该被保留,不应该被新的 handle 复用。posix api 里的文件 id 就不符合这一点。
- 提供一个 api 可以判断一个 handle 是否有效,其时间复杂度为 O(1) 。
- 从 handle 对应为对象的内存地址的时间复杂度应该为 O(1) ,不应该比指针有明显的性能问题。虽然 hash 表理论上可以满足 O(1) 的时间复杂度,但在糟糕的场景(hash 碰撞发生时)并不能保证这一点。
- 构造 handle 时间复杂度也为 O(1) 。
- handle 的数字位宽最好不要超过 32 bit 。