diff options
| author | stderr64 <stderr64@null.net> | 2026-10-08 21:39:15 +0300 |
|---|---|---|
| committer | stderr64 <stderr64@null.net> | 2026-10-08 21:39:15 +0300 |
| commit | ce53d686f534aa680425f680577e4665ef903a4f (patch) | |
| tree | a317d8d549cecd72ef1c533a0672610d272aa42a | |
| parent | 9c3a0e5eb91141ce145cecded932b2eadda299d7 (diff) | |
| download | libxorshift-ce53d686f534aa680425f680577e4665ef903a4f.tar.gz libxorshift-ce53d686f534aa680425f680577e4665ef903a4f.tar.zst | |
Made state array size and shift value for state selection configurable
Now the state array size and the shift value for state selection are confirutable through the Makefile or through environment variables STATE_SIZE and SHIFT_VALUE
| -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; } |
