Класс для генерации рандомных строк

Тема в разделе "Программирование", создана пользователем Antlion, 27 июн 2019.

  1. Antlion

    Antlion New Member

    Сообщения:
    14
    Симпатии:
    0
    За место Random используйте всегда RNGCryptoServiceProvider или RandomNumberGenerator
    P.S:

    Код:
    namespace MoreInfoTest.RandomClass
    {
    using System;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;

    public class GenRandomString
    {
    private static readonly char[] AvailableCharacters =
    {
    A, B, C, D, E, F, G, H, I, J, K, L, M,
    N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
    a, b, c, d, e, f, g, h, i, j, k, l, m,
    n, o, p, q, r, s, t, u, v, w, x, y, z,
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -, _
    };

    // OutPut: uqlseSTR88znYK6XkkX4gnk4XKVoAT1ScZ1wjRCG
    internal static string GenerateIdentifier(int length)
    {
    char[] identifier = new char[length];
    byte[] randomData = new byte[length];

    using (var rng = new RNGCryptoServiceProvider())
    {
    rng.GetBytes(randomData);
    }

    for (int idx = 0; idx identifier.Length; idx++)
    {
    identifier[idx] = AvailableCharacters[randomData[idx] % AvailableCharacters.Length];
    }

    return new string(identifier);
    }
    // OutPut: bKdkeZXx3tUxUZmOgGxQoXlRncCpGszgZenKU9PF
    internal static string RandomString(int length)
    {
    const string ALPHABIT = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    var res = new StringBuilder();
    using (var rng = new RNGCryptoServiceProvider())
    {
    byte[] uintBuffer = new byte[sizeof(uint)];

    while (length-- > 0)
    {
    rng.GetBytes(uintBuffer);
    uint num = BitConverter.ToUInt32(uintBuffer, 0);
    res.Append(ALPHABIT[(int)(num % (uint)ALPHABIT.Length)]);
    }
    }

    return res?.ToString();
    }
    // OutPut: DF-16-CD-28-31-F8-E2-D1-FF-B9-28-3D-7F-9C-8F-88
    internal static string GenNumber()
    {
    using (var rnd = RandomNumberGenerator.Create())
    {
    byte[] buffer = new byte[16];
    rnd.GetBytes(buffer);
    return BitConverter.ToString(buffer);
    }
    }
    // OutPut: zV6rzn7LJhcFdUbzvOow66ouRlYrL36EbB4vDMwjW
    internal static string GenerateRandomSecret()
    {
    char[] validChars = Enumerable.Range(A, 26).Concat(Enumerable.Range(a, 26)).Concat(Enumerable.Range(0, 10)).Select(i => (char)i).ToArray();
    byte[] randomByte = new byte[0x40 + 1];

    using (var rnd = new RNGCryptoServiceProvider())
    {
    rnd.GetBytes(randomByte);
    int secretLength = 0x20 + (int)(0x20 * (randomByte[0] / (double)byte.MaxValue));

    return new string(randomByte.Skip(1).Take(secretLength).Select(b => (int)((validChars.Length - 1) * (b / (double)byte.MaxValue))).Select(i => validChars).ToArray());
    }
    }
    // OutPut: 304e0c4789d1ffeec4114350be24aee5d8211cb6ced59f2cc399db4819f9a08c
    internal static string GenToken()
    {
    using (var rng = new RNGCryptoServiceProvider())
    {
    byte[] randomBuffer = new byte[16];
    rng.GetBytes(randomBuffer);

    using (var md5 = SHA256.Create())
    {
    byte[] hashBytes = md5.ComputeHash(randomBuffer);

    var sBuilder = new StringBuilder();
    foreach (byte byt in hashBytes)
    {
    sBuilder.Append(byt.ToString("x2"));
    }

    return sBuilder?.ToString();
    }
    }
    }
    }
    }
    Время выполнения каждого метода:

    Код:
    Console.WriteLine(RandomClass.GenRandomString.RandomString(40)); // 3,2702 ms
    Console.WriteLine(RandomClass.GenRandomString.GenerateIdentifier(40)); // 2,6839 ms
    Console.WriteLine(RandomClass.GenRandomString.GenerateRandomSecret()); // 26,6338 ms
    Console.WriteLine(RandomClass.GenRandomString.GenNumber()); // 7,2761 ms
    Console.WriteLine(RandomClass.GenRandomString.GenToken()); // 10,223 ms

Поделиться этой страницей