/// <summary> /// Uses the RDRAND instrution on Intel IvyBridge and higher CPUs /// to return truely random integers. /// /// CAUTION: If this code is executed /// on non IvyBridge CPUs, it will return null! /// </summary> /// <returns>Random unsigned integer, or 0 if no executing on compatible CPU</returns> public static uint GenerateUnsignedInt() { if (!RdRandLib.GeneratorAvailable()) { return(0); } uint rnd = RdRandLib.Random32(); return(rnd); }
/// <summary> /// Uses the RDRAND instrution on Intel IvyBridge and higher CPUs /// to return truely random byte arrays. /// /// CAUTION: If this code is executed /// on non IvyBridge CPUs, it will return null! /// </summary> /// <param name="length">Size of the byte array</param> /// <returns>Random byte array, or null if no executing on compatible CPU</returns> public static byte[] GenerateBytes(int length) { if (!RdRandLib.GeneratorAvailable()) { return(null); } int numInts = length / 4 + 1; int idx = 0; byte[] r = new byte[length]; for (int i = 0; i < numInts; i++) { uint rnd = RdRandLib.Random32(); byte[] tmp = IntToBytes(rnd); if (idx >= length) { return(r); } r[idx++] = tmp[0]; if (idx >= length) { return(r); } r[idx++] = tmp[1]; if (idx >= length) { return(r); } r[idx++] = tmp[2]; if (idx >= length) { return(r); } r[idx++] = tmp[3]; } return(r); }