int8_t OCSeedRandom() { #if defined(__ANDROID__) || defined(__linux__) || defined(__APPLE__) || defined(__TIZEN__) // Get current time to Seed. uint64_t currentTime = 0; #ifdef __ANDROID__ struct timespec getTs; clock_gettime(CLOCK_MONOTONIC, &getTs); currentTime = (getTs.tv_sec * (uint64_t)1000000000 + getTs.tv_nsec)/1000; #elif _POSIX_TIMERS > 0 struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); currentTime = ts.tv_sec * 1000000 + ts.tv_nsec / 1000; #else struct timeval tv; gettimeofday(&tv, NULL); currentTime = tv.tv_sec * 1000000 + tv.tv_usec; #endif int32_t fd = open("/dev/urandom", O_RDONLY); if (fd >= 0) { uint32_t randomSeed = 0; uint32_t totalRead = 0; //how many integers were read int32_t currentRead = 0; while (totalRead < sizeof(randomSeed)) { currentRead = read(fd, (uint8_t*) &randomSeed + totalRead, sizeof(randomSeed) - totalRead); if (currentRead > 0) { totalRead += currentRead; } } close(fd); srand(randomSeed | currentTime); } else { // Do time based seed when problem in accessing "/dev/urandom" srand(currentTime); } return 0; #elif defined ARDUINO uint32_t result =0; uint8_t i; for (i=32; i--;) { result += result + GetRandomBit(); } randomSeed(result); return 0; #endif }
int8_t OCSeedRandom() { #ifndef ARDUINO // Get current time to Seed. uint64_t currentTime = 0; #ifdef __ANDROID__ struct timespec getTs; clock_gettime(CLOCK_MONOTONIC, &getTs); currentTime = (getTs.tv_sec * (uint64_t)NANO_SEC + getTs.tv_nsec)/1000; #elif _WIN32 LARGE_INTEGER count; if (QueryPerformanceCounter(&count)) { currentTime = count.QuadPart; } #elif _POSIX_TIMERS > 0 struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); currentTime = (ts.tv_sec * (uint64_t)NANO_SEC + ts.tv_nsec)/ 1000; #else struct timeval tv; gettimeofday(&tv, NULL); currentTime = tv.tv_sec * (uint64_t)1000000 + tv.tv_usec; #endif #if defined(__unix__) || defined(__APPLE__) int32_t fd = open("/dev/urandom", O_RDONLY); if (fd >= 0) { uint32_t randomSeed = 0; uint32_t totalRead = 0; //how many integers were read int32_t currentRead = 0; while (totalRead < sizeof(randomSeed)) { currentRead = read(fd, (uint8_t*) &randomSeed + totalRead, sizeof(randomSeed) - totalRead); if (currentRead > 0) { totalRead += currentRead; } } close(fd); srand(randomSeed | currentTime); } else #endif { // Do time based seed when problem in accessing "/dev/urandom" srand(currentTime); } return 0; #elif defined ARDUINO uint32_t result =0; uint8_t i; for (i=32; i--;) { result += result + GetRandomBit(); } #if HAVE_SRANDOM srandom(result); #else srand(result); #endif return 0; #endif }