@@ -117,13 +117,36 @@ gettimeofday(&tv, NULL); srand((unsigned)(tv.tv_sec ^ tv.tv_usec)); # endif } #endif + +uint16_t +of_random16(void) +{ +#if defined(HAVE_ARC4RANDOM) + return arc4random(); +#elif defined(HAVE_GETRANDOM) + uint16_t buffer; + + OF_ENSURE(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); + + return buffer; +#else + static of_once_t onceControl = OF_ONCE_INIT; + + of_once(&onceControl, initRandom); +# ifdef HAVE_RANDOM + return random() & 0xFFFF; +# else + return rand() & 0xFFFF; +# endif +#endif +} uint32_t -of_random(void) +of_random32(void) { #if defined(HAVE_ARC4RANDOM) return arc4random(); #elif defined(HAVE_GETRANDOM) uint32_t buffer; @@ -130,18 +153,31 @@ OF_ENSURE(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); return buffer; #else - static of_once_t onceControl; - - of_once(&onceControl, initRandom); -# ifdef HAVE_RANDOM - return (((uint32_t)(random()) << 16) | ((uint32_t)(random()) & 0xFFFF)); -# else - return (((uint32_t)(rand()) << 16) | ((uint32_t)(rand()) & 0xFFFF)); -# endif + return ((uint32_t)of_random16() << 16) | of_random16(); +#endif +} + +uint64_t +of_random64(void) +{ +#if defined(HAVE_ARC4RANDOM) + uint64_t buffer; + + arc4random_buf(&buffer, sizeof(buffer)); + + return buffer; +#elif defined(HAVE_GETRANDOM) + uint64_t buffer; + + OF_ENSURE(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); + + return buffer; +#else + return ((uint64_t)of_random32() << 32) | of_random32(); #endif } static const char * typeEncodingForSelector(Class class, SEL selector) @@ -289,11 +325,11 @@ #endif objc_setEnumerationMutationHandler(enumerationMutationHandler); do { - of_hash_seed = of_random(); + of_hash_seed = of_random32(); } while (of_hash_seed == 0); } + (void)unload {