【问题标题】:Randomly generated hexadecimal number in C#C#中随机生成的十六进制数
【发布时间】:2010-11-06 10:43:15
【问题描述】:

如何使用 C# 生成具有我选择的长度的随机十六进制数?

【问题讨论】:

    标签: c# random hex


    【解决方案1】:
    static Random random = new Random();
    public static string GetRandomHexNumber(int digits)
    {
        byte[] buffer = new byte[digits / 2];
        random.NextBytes(buffer);
        string result = String.Concat(buffer.Select(x => x.ToString("X2")).ToArray());
        if (digits % 2 == 0)
            return result;
        return result + random.Next(16).ToString("X");
    }
    

    【讨论】:

      【解决方案2】:
          Random random = new Random();
          int num = random.Next();
          string hexString = num.ToString("X");
      

      random.Next() 接受允许您指定最小值和最大值的参数,这就是您控制长度的方式。

      【讨论】:

      • 只有当length <= 8 as int.MaxValue 适合 8 个十六进制数字时才会起作用。
      • 如果他确实希望十六进制字符串具有他选择的长度,您将需要计算十六进制长度为“x”的最小数字和长度为“x”的最大值的代码。跨度>
      • 是的。我故意省略了它,但您基本上只需要在 0xF 上进行转换? ('怪不得我的正则表达式)找到任何与你想要的长度匹配的整数。
      • int num = random.Next(1000, 5000); - 你可以设置任意数量的 Range random.Next(1000, 5000); 这里随机数生成在 1000 到 5000 之间
      【解决方案3】:

      取决于你想要的随机性,但这里有 3 种选择: 1)我通常只使用 Guid.NewGuid 并选择其中的一部分(取决于我想要多少)。

      2) System.Random(请参阅其他回复)如果您只想要“足够随机”就很好。

      3) System.Security.Cryptography.RNGCryptoServiceProvider

      【讨论】:

      • 切片 GUID 对我来说似乎是个坏主意。它们只是整体上独一无二的。 GUID 的许多位肯定不符合随机条件。
      • @spender 是正确的,例如许多 GUID 包含生成它们的 PC 的 MAC 地址。
      • 呃,不,基于 mac 地址的 guid 早在 2000 年就被淘汰了,因为它们被认为是潜在的安全问题。 GUID 现在由随机数生成器生成(122 位随机,6 位非随机)。无论哪种方式,使用 32 位(或更多)位的 guid 切片都会提供比 System.Random 更多的随机数。那就是 - 除非您调用 UuidCreateSequential ,这是为了向后兼容而添加的,以防有人想要旧式 guid,但这是另一回事。
      • 是的。请参阅 msdn.microsoft.com/en-us/library/system.random.aspx 的 System.Random 文档
      【解决方案4】:

      这是一个返回 256 位十六进制字符串 (8x8=256) 的字符串:

      private static string RandomHexString()
      {
          // 64 character precision or 256-bits
          Random rdm = new Random();
          string hexValue = string.Empty;
          int num;
      
          for (int i = 0; i < 8; i++)
          {
              num = rdm.Next(0, int.MaxValue);
              hexValue += num.ToString("X8");
          }
      
          return hexValue;
      }
      

      【讨论】:

      • 按顺序调用多次随机十六进制字符串将不唯一。
      【解决方案5】:

      .... 使用 LINQ

      private static readonly Random _RND = new Random();
      
      public static string GenerateHexString(int digits) {
          return string.Concat(Enumerable.Range(0, digits).Select(_ => _RND.Next(16).ToString("X")));
      }
      

      【讨论】:

        【解决方案6】:

        如果您希望它是加密安全的,您应该使用 RNGCryptoServiceProvider。

        public static string BuildSecureHexString(int hexCharacters)
        {
            var byteArray = new byte[(int)Math.Ceiling(hexCharacters / 2.0)];
            using (var rng = new RNGCryptoServiceProvider())
            {
                rng.GetBytes(byteArray);
            }
            return String.Concat(Array.ConvertAll(byteArray, x => x.ToString("X2")));
        }
        

        【讨论】:

          【解决方案7】:

          创建一个 n 字符(~n/2 字节),随机的十六进制字符串:

          var randBytes = new byte[n/2 + n%2>0?1:0];
          new Random().NextBytes(randBytes);
          var hex = BitConverter.ToString(randBytes).Replace("-", string.Empty).Substring(0,n);
          

          你考虑过 Base64 字符串吗?根据您的应用程序,它们通常会更有用。它们保证为 ASCII 并且每个输入字节提供约 4/3 个字符。创建一个 n 字符串:

          var randBytes = new byte[(n/4 + n%4>0?1:0)*3];
          new Random().NextBytes(randBytes);
          var base64 = Convert.ToBase64String(randBytes).Substring(0,n);
          

          显然,如果您的应用程序不需要奇数个十六进制字符或不是 4 个字符的倍数的 Base64,您可以省略 .Substring(0,n)。

          按照其他发帖人的建议,随意通过将 Random() 设为静态来扩展示例。

          【讨论】:

            【解决方案8】:

            我需要类似于 Python 的 secrets.token_hex 函数的东西。

            如果您需要加密安全的随机字节,您可以在 System.Security.Cryptography 命名空间中使用 RNGCryptoServiceProvider,如下所示:

            using var csprng = new RNGCryptoServiceProvider();
            var bytes = new byte[16];
            
            csprng.GetNonZeroBytes(bytes); // or csprng.GetBytes(…)
            

            要将字节数组转换为十六进制字符串,使用 LINQ 似乎是最易读的选项:

            string.Join("", bytes.Select(b => b.ToString("x2"))); // or "X2" for upper case
            

            输出可能如下所示:

            7fb70c709a5eed32d37ed5771f09c0fe
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-07-03
              • 1970-01-01
              • 1970-01-01
              • 2015-10-07
              • 2016-02-04
              • 1970-01-01
              • 2012-12-09
              相关资源
              最近更新 更多