Я думаю, что у вашего исходного кода есть некоторые проблемы.
Мое решение состояло бы в том, чтобы порождать новую программу, чтобы отслеживать, закончили ли эти 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 ...")
}
Использование Guid было бы довольно хорошим способом, но чтобы получить что-то похожее на ваш пример, вы, вероятно, захотите преобразовать его к строке Base64:
Guid g = Guid.NewGuid();
string GuidString = Convert.ToBase64String(g.ToByteArray());
GuidString = GuidString.Replace("=","");
GuidString = GuidString.Replace("+","");
Я избавляюсь от «=» и «+», чтобы немного приблизиться к вашему примеру, в противном случае вы получите «==» в конце вашей строки и «+» в середине. Вот пример выходной строки:
"OZVV5TpP4U6wJthaCORZEQ"
Я бы предупредил, что 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.
Я не думаю, что они действительно случайны, но я предполагаю, что это некоторые хеши.
Всякий раз, когда Мне нужен какой-то случайный идентификатор, я обычно использую GUID и конвертирую его в «голое» представление:
Guid.NewGuid().ToString("n");
Это было запрошено на разных языках. Вот один вопрос о паролях , который должен быть применим и здесь.
Если вы хотите использовать строки для сокращения URL-адреса, вам также потребуется проверка словаря <> или базы данных, чтобы увидеть, использовался ли уже созданный идентификатор.
Получить уникальный ключ, используя хеш-код 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);
}