summaryrefslogtreecommitdiff
path: root/random.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-12-06 03:25:21 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-12-06 03:25:21 +0000
commit1816e39351aa73dd4360025422fd29ef17473cb2 (patch)
treeda23d3e66fa68d03242535198ee0cd15ea1edbe6 /random.c
parent41a7549b8e1ea26efb0d096d2920fa5bccc745bf (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.c44
1 files changed, 14 insertions, 30 deletions
diff --git a/random.c b/random.c
index a5c5292bc8..6ddf4d186e 100644
--- a/random.c
+++ b/random.c
@@ -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);
}