Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪种方法调用此id生成方法更好?_C#_.net - Fatal编程技术网

C# 哪种方法调用此id生成方法更好?

C# 哪种方法调用此id生成方法更好?,c#,.net,C#,.net,上述方法来自此线程: 它将在抽象事件类中用于生成唯一的eventId。该类将被频繁使用,因为我们需要发送大量事件。当我在事件类构造函数中调用上述方法时,从性能和唯一值的角度来看,哪个选项更好: 使用new创建一个Random对象,每次将其传递到上述方法中 在一开始就创建一个静态Random对象,并在需要时使用它重复调用上述方法 您最好创建一个随机实例并多次使用它。这样,您将获得更好的“随机性” 如果您查看microsoft的文档,您将看到两个随机实例产生完全相同的数字 获得“更好”随机数的另一种

上述方法来自此线程:

它将在抽象事件类中用于生成唯一的eventId。该类将被频繁使用,因为我们需要发送大量事件。当我在事件类构造函数中调用上述方法时,从性能和唯一值的角度来看,哪个选项更好:

  • 使用
    new
    创建一个
    Random
    对象,每次将其传递到上述方法中
  • 在一开始就创建一个静态
    Random
    对象,并在需要时使用它重复调用上述方法

  • 您最好创建一个随机实例并多次使用它。这样,您将获得更好的“随机性”

    如果您查看microsoft的文档,您将看到两个随机实例产生完全相同的数字


    获得“更好”随机数的另一种方法是提供种子。有些人将当前时间作为整数传递,以获得一个非常独特的种子。

    您最好创建一个随机实例并多次使用它。这样,您将获得更好的“随机性”

    如果您查看microsoft的文档,您将看到两个随机实例产生完全相同的数字

    获得“更好”随机数的另一种方法是提供种子。有些人将当前时间作为整数传递,以获得非常独特的种子。

    • 无论如何,你需要选择2),否则你的所有随机数都是一样的。看
    • 您可以将此方法转换为扩展
    像这样:

    private static Int64 NextInt64(Random rnd) 
    {     
        var buffer = new byte[sizeof(Int64)];     
        rnd.NextBytes(buffer);     
        return BitConverter.ToInt64(buffer, 0); 
    } 
    
    但是

    它将在抽象事件类中用于生成唯一的eventId

    不,这不会生成唯一Id。为碰撞做好准备

    使用简单计数器(nextId)或GUID
  • 无论如何,你需要选择2),否则你的所有随机数都是一样的。看
  • 您可以将此方法转换为扩展
  • 像这样:

    private static Int64 NextInt64(Random rnd) 
    {     
        var buffer = new byte[sizeof(Int64)];     
        rnd.NextBytes(buffer);     
        return BitConverter.ToInt64(buffer, 0); 
    } 
    
    但是

    它将在抽象事件类中用于生成唯一的eventId

    不,这不会生成唯一Id。为碰撞做好准备


    使用简单计数器(nextId)或GUID将导致随机性问题,除非每次都给它一个唯一的种子。更不用说对垃圾收集器施加额外的压力了


    2是一个更好的选择-Random类被设计为生成一个随机数序列,而不仅仅是一个。因此,尽管最好是使用单个Random实例,但它不一定需要使用静态属性访问,它可以以多种方式公开。

    1会导致随机性问题,除非每次都为其提供唯一的种子。更不用说对垃圾收集器施加额外的压力了


    2是一个更好的选择-Random类被设计为生成一个随机数序列,而不仅仅是一个。因此,尽管最好是使用单个Random实例,但它不一定需要使用静态属性访问,它可以以多种方式公开。

    系统Guid结构正是为了实现这一目的。与其尝试传递看似随机的对象,不如将guid结构作为参数传递

     public static class Helpers
     {
       public static Int64 NextInt64(this Random rnd) { ... }
     }
    
    顾名思义,它已经用于表示全局唯一标识符。另外,如果您坚持使用随机数,请在
    System.Security.Cryptography
    命名空间内使用
    RandomNumberGenerator
    。如果足够大,您的随机数几乎是唯一的:

    private static Guid  NextIntGuid() 
    {
      return Guid.NewGuid();
    }
    

    系统Guid结构正是为此目的而设计的。与其尝试传递看似随机的对象,不如将guid结构作为参数传递

     public static class Helpers
     {
       public static Int64 NextInt64(this Random rnd) { ... }
     }
    
    顾名思义,它已经用于表示全局唯一标识符。另外,如果您坚持使用随机数,请在
    System.Security.Cryptography
    命名空间内使用
    RandomNumberGenerator
    。如果足够大,您的随机数几乎是唯一的:

    private static Guid  NextIntGuid() 
    {
      return Guid.NewGuid();
    }
    

    为什么不使用Guid,然后使用Guid.NewGuid()?(一条评论,因为它不能回答你的问题——更多的是关于此代码对随机值的有效性)它是一条有效的评论——使用随机生成唯一数字是一个糟糕的决定。我再怎么强调使用随机数作为“唯一键”的愚蠢也不为过。对于64位随机数,在大约6.1亿项之后,有1%的几率生成重复项。一行可以生成两次相同的数字。我强烈建议您使用其他方法生成唯一密钥。为什么不使用Guid,然后使用
    Guid.NewGuid()
    ?(一条评论,因为它不能回答你的问题——更多的是关于此代码对随机值的有效性)它是一条有效的评论——使用随机生成唯一数字是一个糟糕的决定。我再怎么强调使用随机数作为“唯一键”的愚蠢也不为过。对于64位随机数,在大约6.1亿项之后,有1%的几率生成重复项。一行可以生成两次相同的数字。我强烈建议您使用其他方法生成唯一密钥。无参数构造函数将当前时间(从
    环境.TickCount
    )作为种子传递。使用另一个构造函数的最常见原因是,如果您希望确保每次都生成相同的随机数序列,通常是出于测试目的。网络视频游戏就是一个很好的现实例子——在多台客户端计算机上进行模拟,您可能希望确保每个客户端计算机以相同的顺序生成相同的随机数。无参数构造函数将当前时间(从
    环境。TickCount
    )作为种子传递。使用另一个构造函数最常见的原因是,如果您想确保每次都生成相同的随机数序列,通常是出于测试目的