C # - Какой самый эффективный способ для генерации 10 символов случайной буквенно-цифровой строки в? - PullRequest
1 голос
/ 28 июня 2011

Каков наиболее эффективный способ создания 10-символьной случайной буквенно-цифровой строки в c #?

Ответы [ 4 ]

4 голосов
/ 17 апреля 2012

http://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename.aspx

string randomName = Path.GetRandomFileName();
randomName = randomName.Replace(".", string.Empty);

// take substring...

например:

?Path.GetRandomFileName();
"rlwi1uew.5ha"
?Path.GetRandomFileName();
"gcwhcoiy.vxl"
?Path.GetRandomFileName();
"2pzyljzf.k41"
?Path.GetRandomFileName();
"kyjzcccf.d3c"
3 голосов
/ 28 июня 2011
var buffer = new byte[5];
new Random().NextBytes(buffer);
Console.WriteLine(string.Join("", buffer.Select(b => b.ToString("X2"))));
0 голосов
/ 28 июня 2011
var buffer = new byte[15];
new Random().NextBytes(buffer);
string rnd = Convert.ToBase64String (buffer).Substring (10);

Единственная проблема, которую я вижу с этим, состоит в том, что он также использует + и /, поэтому вам придется заменить их чем-то тоже.

string rnd = Convert.ToBase64String (buffer)
   .Substring (10)
   .Replace ('/', '0')
   .Replace ('+', '1');
0 голосов
/ 28 июня 2011

Guid довольно быстрый

Guid.NewGuid().ToString("N").Substring(0, 10);

Из MSDN

GUID - это 128-разрядное целое число (16 байт), которое можно использовать длявсе компьютеры и сети, где требуется уникальный идентификатор.Такой идентификатор имеет очень низкую вероятность дублирования.

Он может быть не уникальным для миллиарда запросов, так как вам нужно всего 10 символов.Но он генерирует строку от 0 до 9 и от A до F.


Производительность

Проверено с использованием

public static void Test(Action a)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();

    for (var i = 0; i < 10000; ++i)
        a();

    sw.Stop();

    Console.WriteLine("ms: {0} ticks: {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
}

Метод Guid

Test(() =>
{
    var xxx = Guid.NewGuid().ToString("N").Substring(0, 10);
});

// Result
// 6     ms
// 17273 ticks

Метод байтов

Test(() =>
{
    var buffer = new byte[5];
    new Random().NextBytes(buffer);
    var x = string.Join("", buffer.Select(b => b.ToString("X2")));
});

// Result:
// 57     ms
// 165642 ticks

Вы можете выбрать между high speed или high reliability.

...