int GetRandBytes(void * const buffer, const int iLen){
if(NULL == buffer || 0 == iLen )
return -1;
HCRYPTPROV hProvider = 0;
DWORD dwRes =::CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT);
if(dwRes == FALSE)
return -1;
dwRes = ::CryptGenRandom(hProvider, iLen, (unsigned char*)buffer);
if(dwRes == FALSE)
return -1;
::CryptReleaseContext(hProvider, 0);
return 0;
}
template <typename T>
T Random_GetNBytes(){
const int iLen = sizeof(T);
unsigned char buffer [iLen] = {0};
if(0 == GetRandBytes(buffer, iLen) ){
return *(T*)buffer;
}
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return li.QuadPart & ReadTimeStampCounter;
}