diff options
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | structs.h | 2 | ||||
| -rw-r--r-- | xorshift.c | 11 |
3 files changed, 11 insertions, 8 deletions
@@ -1,13 +1,15 @@ CC=gcc OUTPUT_MULTIPLIER=0x6ab64cc1 +STATE_SIZE=32U +SHIFT_VALUE=27U rel: mkdir -p ./build - $(CC) -Wall -Werror -pedantic -O2 -march=x86-64-v3 -mavx2 -std=gnu23 -DOUTPUT_MULTIPLIER=${OUTPUT_MULTIPLIER} -shared -fPIC ./xorshift.c -o ./build/libxorshift.so + $(CC) -Wall -Werror -pedantic -O2 -march=x86-64-v3 -mavx2 -std=gnu23 -DSHIFT_VALUE=${SHIFT_VALUE} -DSTATE_SIZE=${STATE_SIZE} -DOUTPUT_MULTIPLIER=${OUTPUT_MULTIPLIER} -shared -fPIC ./xorshift.c -o ./build/libxorshift.so debug: mkdir -p ./build - $(CC) -Wall -Werror -pedantic -O2 -march=x86-64-v3 -mavx2 -std=gnu23 -ggdb -DOUTPUT_MULTIPLIER=${OUTPUT_MULTIPLIER} -shared -fPIC ./xorshift.c -o ./build/libxorshift.so + $(CC) -Wall -Werror -pedantic -O2 -march=x86-64-v3 -mavx2 -std=gnu23 -ggdb -DSHIFT_VALUE=${SHIFT_VALUE} -DSTATE_SIZE=${STATE_SIZE} -DOUTPUT_MULTIPLIER=${OUTPUT_MULTIPLIER} -shared -fPIC ./xorshift.c -o ./build/libxorshift.so clean: rm -rf ./build @@ -1,6 +1,6 @@ struct rng_state{ size_t state_idx; - uint32_t states[16]; + uint32_t states[STATE_SIZE]; uint32_t gen_period_ctr; uint8_t period_end_ctr; }; @@ -7,6 +7,7 @@ #include <assert.h> #include <limits.h> #include <sys/random.h> +#include <math.h> #include <string.h> #include "structs.h" @@ -16,23 +17,23 @@ __attribute__((visibility("default"))) bool initialize_states(){ assert( (sizeof(uint32_t) * CHAR_BIT) == 32 ); memset( (void*)&global_rng_state, 0, sizeof(struct rng_state) ); ssize_t state_bytes_read = 0; - if ( (state_bytes_read = getrandom((void*)&global_rng_state.states, 16 * sizeof(uint32_t), GRND_NONBLOCK)) == -1 ) + if ( (state_bytes_read = getrandom((void*)&global_rng_state.states, STATE_SIZE * sizeof(uint32_t), GRND_NONBLOCK)) == -1 ) return false; - if ( (size_t)state_bytes_read < (16 * sizeof(uint32_t)) ){ + if ( (size_t)state_bytes_read < (STATE_SIZE * sizeof(uint32_t)) ){ errno = EIO; return false; } - global_rng_state.state_idx = global_rng_state.states[7] >> 28; + global_rng_state.state_idx = global_rng_state.states[(uint32_t)(floor(STATE_SIZE / 2))] >> SHIFT_VALUE; errno = 0; return true; } __attribute__((visibility("default"))) uint32_t get_random_output(){ size_t use_state = global_rng_state.state_idx; - global_rng_state.state_idx = global_rng_state.states[use_state] >> 28; + global_rng_state.state_idx = global_rng_state.states[use_state] >> SHIFT_VALUE; if ( global_rng_state.gen_period_ctr >= 0xffffffff ){ global_rng_state.period_end_ctr++; - if ( global_rng_state.period_end_ctr >= 16 ){ + if ( global_rng_state.period_end_ctr >= STATE_SIZE ){ assert( initialize_states() == true ); global_rng_state.period_end_ctr = 0; } |
