diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-12-06 03:25:21 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-12-06 03:25:21 +0000 |
commit | 1816e39351aa73dd4360025422fd29ef17473cb2 (patch) | |
tree | da23d3e66fa68d03242535198ee0cd15ea1edbe6 /random.c | |
parent | 41a7549b8e1ea26efb0d096d2920fa5bccc745bf (diff) |
random.c: pack hash seeds
* random.c (seed_keys_t, init_seed): pack seed for rb_hash_start and
rb_memhash, and fill them at once.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56990 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
-rw-r--r-- | random.c | 44 |
1 files changed, 14 insertions, 30 deletions
@@ -1473,50 +1473,35 @@ random_s_rand(int argc, VALUE *argv, VALUE obj) #endif #include "siphash.c" -static st_index_t hashseed; -typedef uint8_t sipseed_keys_t[16]; -static union { - sipseed_keys_t key; - uint32_t u32[type_roomof(sipseed_keys_t, uint32_t)]; -} sipseed; +typedef struct { + st_index_t hash; + uint8_t sip[16]; +} seed_keys_t; -static void -init_hashseed(struct MT *mt) -{ - hashseed = genrand_int32(mt); -#if SIZEOF_ST_INDEX_T*CHAR_BIT > 4*8 - hashseed <<= 32; - hashseed |= genrand_int32(mt); -#endif -#if SIZEOF_ST_INDEX_T*CHAR_BIT > 8*8 - hashseed <<= 32; - hashseed |= genrand_int32(mt); -#endif -#if SIZEOF_ST_INDEX_T*CHAR_BIT > 12*8 - hashseed <<= 32; - hashseed |= genrand_int32(mt); -#endif -} +static union { + seed_keys_t key; + uint32_t u32[type_roomof(seed_keys_t, uint32_t)]; +} seed; static void -init_siphash(struct MT *mt) +init_seed(struct MT *mt) { int i; - for (i = 0; i < numberof(sipseed.u32); ++i) - sipseed.u32[i] = genrand_int32(mt); + for (i = 0; i < numberof(seed.u32); ++i) + seed.u32[i] = genrand_int32(mt); } st_index_t rb_hash_start(st_index_t h) { - return st_hash_start(hashseed + h); + return st_hash_start(seed.key.hash + h); } st_index_t rb_memhash(const void *ptr, long len) { - sip_uint64_t h = sip_hash24(sipseed.key, ptr, len); + sip_uint64_t h = sip_hash24(seed.key.sip, ptr, len); #ifdef HAVE_UINT64_T return (st_index_t)h; #else @@ -1539,8 +1524,7 @@ Init_RandomSeedCore(void) fill_random_seed(initial_seed, DEFAULT_SEED_CNT); init_by_array(&mt, initial_seed, DEFAULT_SEED_CNT); - init_hashseed(&mt); - init_siphash(&mt); + init_seed(&mt); explicit_bzero(initial_seed, DEFAULT_SEED_LEN); } |