Index: src/OFMapTable.m ================================================================== --- src/OFMapTable.m +++ src/OFMapTable.m @@ -151,19 +151,12 @@ buckets = [self allocMemoryWithSize: sizeof(*buckets) count: capacity]; memset(buckets, 0, capacity * sizeof(*buckets)); - if (of_hash_seed != 0) { -#if defined(OF_HAVE_ARC4RANDOM) - seed = arc4random(); -#elif defined(OF_HAVE_RANDOM) - seed = random(); -#else - seed = rand(); -#endif - } + if (of_hash_seed != 0) + seed = of_random(); } @catch (id e) { [self release]; @throw e; } @@ -318,17 +311,11 @@ for (i = 0; i < newCapacity; i++) newBuckets[i] = NULL; if (of_hash_seed != 0) { -#if defined(OF_HAVE_ARC4RANDOM) - newSeed = arc4random(); -#elif defined(OF_HAVE_RANDOM) - newSeed = random(); -#else - newSeed = rand(); -#endif + newSeed = of_random(); seedUpdate = seed ^ newSeed; } for (i = 0; i < capacity; i++) { if (buckets[i] != NULL && buckets[i] != &deleted) { Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -875,11 +875,12 @@ #ifdef __cplusplus extern "C" { #endif extern id of_alloc_object(Class class_, size_t extraSize, size_t extraAlignment, void **extra); +extern uint32_t of_random(void); extern size_t of_pagesize; extern size_t of_num_cpus; extern uint32_t of_hash_seed; #ifdef __cplusplus } #endif Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -226,10 +226,42 @@ if OF_UNLIKELY (extra != NULL) *extra = (char*)instance + instanceSize + extraAlignment; return instance; } + +uint32_t +of_random() +{ +#if defined(OF_HAVE_ARC4RANDOM) + return arc4random(); +#elif defined(OF_HAVE_RANDOM) + static BOOL initialized = NO; + + if (!initialized) { + struct timeval t; + + gettimeofday(&t, NULL); + srandom(t.tv_sec ^ t.tv_usec); + initialized = YES; + } + + return (random() << 16) | (random() & 0xFFFF); +#else + static BOOL initialized = NO; + + if (!initialized) { + struct timeval t; + + gettimeofday(&t, NULL); + srand(t.tv_sec ^ t.tv_usec); + initialized = YES; + } + + return (random() << 16) | (random() & 0xFFFF); +#endif +} const char* _NSPrintForDebugger(id object) { return [[object description] @@ -277,23 +309,11 @@ if ((of_num_cpus = sysconf(_SC_NPROCESSORS_CONF)) < 1) # endif of_num_cpus = 1; #endif -#if defined(OF_HAVE_ARC4RANDOM) - of_hash_seed = arc4random(); -#elif defined(OF_HAVE_RANDOM) - struct timeval t; - gettimeofday(&t, NULL); - srandom(t.tv_usec); - of_hash_seed = random(); -#else - struct timeval t; - gettimeofday(&t, NULL); - srand(t.tv_usec); - of_hash_seed = rand(); -#endif + of_hash_seed = of_random(); } + (void)initialize { }