Hallo,
ich habe mir mit Visual C++ in einer Win32-Konsolenanwendung einen kleinen Thread-sicheren Zufallsgenerator geschrieben, der auf der Blockverschlüsselung XTEA basiert (mit etwas geänderter Erzeugung der Rundenschlüssel):
Nach langem Herumsuchen habe ich diesen Mutex-Mechanismus gefunden.
Er funktioniert auch, aber leider ist das Mutex ziemlich uneffizient: ein Aufruf von getnumber() dauert glatt zehnmal so lang wie ohne Mutex
Kann mir jemand eine andere Möglichkeit enpfehlen, die effizienter ist?
ich habe mir mit Visual C++ in einer Win32-Konsolenanwendung einen kleinen Thread-sicheren Zufallsgenerator geschrieben, der auf der Blockverschlüsselung XTEA basiert (mit etwas geänderter Erzeugung der Rundenschlüssel):
Code:
#include <windows.h> class PRNG { HANDLE mutex; unsigned x[2], c0, c1, xi; public: PRNG(); unsigned getnumber(); }; PRNG::PRNG() { mutex = CreateMutex (NULL, FALSE, NULL); x[0] = x[1] = c0 = c1 = xi = 0; } unsigned PRNG::getnumber() { WaitForSingleObject (mutex, INFINITE); unsigned result; if (xi) result = x[--xi]; else { if (++c0 == 0) ++c1; x[0] ^= c0; x[1] ^= c1; unsigned s = 0; for (int c=0 ; c<32 ; ++c) { s ^= 0xb7e15163 + c; x[1] += (x[0] << 4 ^ x[0] >> 5) + x[0] ^ s; s += 0x9e3779b9; x[0] += (x[1] << 4 ^ x[1] >> 5) + x[1] ^ s; } result = x[xi = 1]; } ReleaseMutex (mutex); return result; }
Er funktioniert auch, aber leider ist das Mutex ziemlich uneffizient: ein Aufruf von getnumber() dauert glatt zehnmal so lang wie ohne Mutex
Kann mir jemand eine andere Möglichkeit enpfehlen, die effizienter ist?
Comment