Ostatnio musiałem skorzystać z możliwości “nieograniczonej” generacji ciągów pseudolosowych. W Linuxie sprawa jest prosta – otwieramy /dev/random i cytamy zeń wymaganą licznę znaków. Gorzej z tym pod Windowsem, który mimo, że podobne wirtualne urządzenie posiada, to nie umożliwia adekwatnego skorzystania z niego. Efekt podobny można jednak uzyskać – np. przez wywołanie, np przez win32com, funkcji CryptGenRandom z Advapi32.dll (msdn). Lub jeszcze prościej – skorzystać z random.SystemRandom. Z tym ostatnim jest jednak jeden problem – generuje n-bitowe liczby długie. Poniżej przykładowe zastosowanie z jednoczesną konwersją na ciąg znaków (coby lepiej /dev/random emulować ;)):
1 2 3 4 5 6 7 8 9 10 11 12 | nbit = 1024 r = random.SystemRandom().getrandbits(nbit) devrandom = "" char = 0 for c in xrange(1,nbit+1): char |= r & 1 r >>= 1 if c % 8 == 0: devrandom += chr(char) char = 0 else: char <<= 1 |
Po zakończeniu pętli w zmiennej devrandom znajdzie się (nbit/8) bajtowy ciąg losowych znaków.
0 Responses to “/dev/random w Windowsie”