哪种方式调用这个id生成方法更好
本文关键字:方法 更好 id 方式 调用 | 更新日期: 2023-09-27 17:50:22
private static Int64 NextInt64(Random rnd)
{
var buffer = new byte[sizeof(Int64)];
rnd.NextBytes(buffer);
return BitConverter.ToInt64(buffer, 0);
}
在c#中生成随机值
它将在抽象事件类中使用,以生成唯一的eventId。这个类将被频繁使用,因为我们需要发送大量的事件。当我在事件类构造函数中调用上述方法时,从性能和唯一值的角度来看,哪个选项更好:
- 用
new
创建一个Random
对象,每次传递给上述方法; - 一开始就创建一个静态的
Random
对象,并在需要时使用它来重复调用上述方法。
您最好创建一个Random实例并多次使用它。这样你将获得更好的"随机性"。
如果你查看微软的文档,你会看到两个Random实例产生完全相同的数字。
另一种获得"更好"随机数的方法是提供种子。有些将当前时间作为int传递,以获得一个非常独特的种子。
- 无论如何你都需要选择2),否则你所有的随机值都是一样的。看到这个。 你可以把这个方法变成一个扩展,
:
public static class Helpers
{
public static Int64 NextInt64(this Random rnd) { ... }
}
但是…
它将在抽象事件类中使用,以生成唯一的eventId。
不,这不会生成唯一的Id。做好碰撞的准备。
使用一个简单的计数器(nextId)或GUids
System Guid结构正是为了这个目的。与其试图传递一个看似随机的对象,不如传递一个guid结构作为参数。
private static Guid NextIntGuid()
{
return Guid.NewGuid();
}
顾名思义,它已经用于表示全局唯一标识符。另外,如果坚持使用随机数,请在System.Security.Cryptography
名称空间内使用RandomNumberGenerator
。如果足够大,你的随机数几乎是唯一的:
byte[] random = new Byte[128];
//RNGCryptoServiceProvider is an implementation of a random number generator.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(random); // The array is now filled with cryptographically strong random bytes.
1将导致随机性问题,除非你每次都给它一个唯一的种子。更不用说给垃圾收集器带来额外的压力了。
2是一个更好的选择——Random类是设计成生成一个随机数序列,而不仅仅是一个。因此,虽然拥有Random的单个实例更好,但它不一定需要通过静态属性访问,它可以以多种方式暴露。