哪种方式调用这个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。这个类将被频繁使用,因为我们需要发送大量的事件。当我在事件类构造函数中调用上述方法时,从性能和唯一值的角度来看,哪个选项更好:

  1. new创建一个Random对象,每次传递给上述方法;
  2. 一开始就创建一个静态的Random对象,并在需要时使用它来重复调用上述方法。

哪种方式调用这个id生成方法更好

您最好创建一个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的单个实例更好,但它不一定需要通过静态属性访问,它可以以多种方式暴露。