Уникальное поколение случайной строки

Я думаю, что у вашего исходного кода есть некоторые проблемы.

  1. Вы закрываете канал перед чтением с него.
  2. Вы не получаете преимущества от использования 10 процедур, потому что ваш канал 1 «размера». Таким образом, одна процедура дает один результат за один раз.

Мое решение состояло бы в том, чтобы порождать новую программу, чтобы отслеживать, закончили ли эти 10 операций. Там вы будете использовать свой WaitGroup.

Тогда код будет выглядеть так:

package main

import (
    "fmt"
    "runtime"
    "sync"
)

var wg sync.WaitGroup

func main() {
    ch := make(chan int, 10)

    for i := 0; i < 10; i++ { // creates 10 go routines and adds to waitgroup
        wg.Add(1)
        go func() {
            for j := 0; j < 10; j++ {
                ch <- j
            }
            wg.Done() // indication of go routine is done to main routine
        }()
    }

    go func(){
        wg.Wait()
        close(ch)
    }()

    fmt.Println(runtime.NumGoroutine())
    for v := range ch { // range can be used since channel is closed
        fmt.Println(v)
    }
    fmt.Println("About to exit program ...")
}
91
задан Rich Warrior 21 August 2019 в 19:17
поделиться

6 ответов

Использование Guid было бы довольно хорошим способом, но чтобы получить что-то похожее на ваш пример, вы, вероятно, захотите преобразовать его к строке Base64:

    Guid g = Guid.NewGuid();
    string GuidString = Convert.ToBase64String(g.ToByteArray());
    GuidString = GuidString.Replace("=","");
    GuidString = GuidString.Replace("+","");

Я избавляюсь от «=» и «+», чтобы немного приблизиться к вашему примеру, в противном случае вы получите «==» в конце вашей строки и «+» в середине. Вот пример выходной строки:

"OZVV5TpP4U6wJthaCORZEQ"

75
ответ дан Mark Synowiec 24 November 2019 в 06:38
поделиться

Я бы предупредил, что GUID - это , а не случайные числа . Они не должны использоваться в качестве основы для создания чего-либо, что вы ожидаете быть абсолютно случайным (см. http://en.wikipedia.org/wiki/Globally_Unique_Identifier ):

Криптоанализ генератора WinAPI GUID показывает, что, поскольку последовательность идентификаторов GUID V4 является псевдослучайной, с учетом начального состояния можно прогнозировать до 250 000 идентификаторов GUID, возвращаемых функцией UuidCreate. Вот почему GUID не следует использовать в криптографии, например, в качестве случайных ключей. Вместо этого просто используйте метод C # Random. Примерно так (код найден здесь ):

private string RandomString(int size)
{
  StringBuilder builder = new StringBuilder();
  Random random = new Random();
  char ch ;
  for(int i=0; i<size; i++)
  {
    ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))) ;
    builder.Append(ch);
  }
  return builder.ToString();
}

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

Редактировать . Microsoft говорит, что Random тоже не так уж хорош ( http://msdn.microsoft.com/en-us/library/system.random (VS.71) .aspx ):

Чтобы сгенерировать криптографически безопасное случайное число, подходящее для создания случайного пароля, например, используйте класс, производный от System.Security.Cryptography.RandomNumberGenerator, например System.Security.Cryptography.RNGCryptoServiceProvider.

38
ответ дан Keltex 24 November 2019 в 06:38
поделиться

Я не думаю, что они действительно случайны, но я предполагаю, что это некоторые хеши.

Всякий раз, когда Мне нужен какой-то случайный идентификатор, я обычно использую GUID и конвертирую его в «голое» представление:

Guid.NewGuid().ToString("n");
11
ответ дан Lucero 24 November 2019 в 06:38
поделиться

Это было запрошено на разных языках. Вот один вопрос о паролях , который должен быть применим и здесь.

Если вы хотите использовать строки для сокращения URL-адреса, вам также потребуется проверка словаря <> или базы данных, чтобы увидеть, использовался ли уже созданный идентификатор.

0
ответ дан Community 24 November 2019 в 06:38
поделиться
  • не уверен, что ссылки Microsoft генерируются случайным образом
  • , посмотрите на новый Guid (). ToString ()
-1
ответ дан Fabian Vilers 24 November 2019 в 06:38
поделиться

Получить уникальный ключ, используя хеш-код GUID

public static string GetUniqueKey(int length)
{
    string guidResult = string.Empty;

    while (guidResult.Length < length)
    {
        // Get the GUID.
        guidResult += Guid.NewGuid().ToString().GetHashCode().ToString("x");
    }

    // Make sure length is valid.
    if (length <= 0 || length > guidResult.Length)
        throw new ArgumentException("Length must be between 1 and " + guidResult.Length);

    // Return the first length bytes.
    return guidResult.Substring(0, length);
}
-1
ответ дан Chris Doggett 24 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: