【发布时间】:2011-04-15 15:43:56
【问题描述】:
private static Int64 NextInt64(Random rnd)
{
var buffer = new byte[sizeof(Int64)];
rnd.NextBytes(buffer);
return BitConverter.ToInt64(buffer, 0);
}
以上方法来自这个帖子:Generate random values in C#
它将用于抽象事件类中以生成唯一的 eventId。该类将经常使用,因为我们需要发送大量事件。当我在事件类构造函数中调用上述方法时,从性能和唯一值的角度来看,哪个选项更好:
- 用
new创建一个Random对象,每次都传递给上面的方法; - 一开始就创建一个静态
Random对象,并在需要时使用它重复调用上述方法。
【问题讨论】:
-
为什么不用Guids 然后
Guid.NewGuid()? (评论,因为它不回答您的问题 - 它更多的是关于此代码对随机值的有效性) -
这是一个有效的评论 - 使用随机生成 唯一 数字是一个糟糕的决定。
-
我不能再强调使用随机数作为“唯一密钥”的愚蠢行为。使用 64 位随机数,在大约 6.1 亿个项目后有 1% 的机会生成重复项。连续两次生成相同的数字是可能的。我强烈建议您使用其他方法来生成唯一密钥。