rand: use time microseconds too in default rand initialization; generate proper uuid_v4

pull/5965/head
Delyan Angelov 2020-07-24 14:28:27 +03:00
parent c429fa7e27
commit 289974dd15
4 changed files with 17 additions and 5 deletions

View File

@ -25,12 +25,15 @@ fn gen_randoms(seed_data []u32, bound int) []u32 {
}
fn test_pcg32_reproducibility() {
randoms1 := gen_randoms(util.time_seed_array(4), 1000)
randoms2 := gen_randoms(util.time_seed_array(4), 1000)
seed_data := util.time_seed_array(4)
randoms1 := gen_randoms(seed_data, 1000)
randoms2 := gen_randoms(seed_data, 1000)
assert randoms1.len == randoms2.len
len := randoms1.len
for i in 0 .. len {
assert randoms1[i] == randoms2[i]
r1 := randoms1[i]
r2 := randoms2[i]
assert r1 == r2
}
}

View File

@ -149,13 +149,18 @@ pub fn string(len int) string {
pub fn uuid_v4() string {
mut buf := malloc(37)
for i in 0..36 {
mut v := intn(16)
if i == 19 {
v = (v & 0x3) | 0x8
}
unsafe {
buf[i] = hex_chars[intn(16)]
buf[i] = hex_chars[v]
}
}
unsafe {
buf[8] = `-`
buf[13] = `-`
buf[14] = `4`
buf[18] = `-`
buf[23] = `-`
buf[36] = 0

View File

@ -186,4 +186,7 @@ fn test_rand_uuid_v4() {
assert uuid1.len == 36
assert uuid2.len == 36
assert uuid3.len == 36
assert uuid1[14] == `4`
assert uuid2[14] == `4`
assert uuid3[14] == `4`
}

View File

@ -25,7 +25,8 @@ fn nr_next(prev u32) u32 {
// time_seed_array is a utility function that returns the required number of u32s generated from system time
[inline]
pub fn time_seed_array(count int) []u32 {
mut seed := u32(time.now().unix_time())
ctime := time.now()
mut seed := u32(ctime.unix_time() ^ ctime.microsecond)
mut seed_data := []u32{cap: count}
for _ in 0 .. count {
seed = nr_next(seed)