【发布时间】:2011-11-26 11:30:16
【问题描述】:
我需要生成一个唯一的数字 ID 以附加到传入请求。此 ID 仅用于临时跟踪请求,并且在请求完成处理后将被丢弃。此 ID 将仅在此应用程序的上下文中使用,但需要以高性能多线程方式分配。
我正在考虑将 DateTime.Now.Ticks 用于此 ID,但想知道如果同时处理同时请求,DateTime.Now.Ticks 是否仍然可以生成冲突 ID?
如果有人能提出一种更好的方法来在多线程环境中生成这些 ID(最好是不是像 Tick 那样的 Int64 的),请告诉我。像递增数字这样简单的东西就足够了,只要我不必在递增之前锁定数字。
非常感谢您的帮助。
【问题讨论】:
-
使用 GUID/UUID 有什么问题?
-
生成 GUID 的开销太大。我需要的 ID 对于进程来说是唯一的(不是全局的),并且只在每个请求的持续时间内使用。
-
“开销太大”? GUID 只需要生成几个字节的随机数据。它并不昂贵。听起来您正在进行过早的优化。
-
也许它在实际时间中是微不足道的,但从一些基本测试来看,它看起来比具有 8 个并发线程的 interlocked.increment 慢 10 倍左右。
-
那么公平,如果您生成的 ID 足够重要。
标签: c# .net multithreading algorithm concurrency