X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fxoshiro.c;fp=src%2Fxoshiro.c;h=c05e9405a2e7b33d191d1ba5b4dbda60aee72714;hb=ea20fcfcded669ce8fbbda3a1f93f354ed254603;hp=0000000000000000000000000000000000000000;hpb=ac63b6adaf29c4143f9e106039011b9ebeb96b93;p=meshlink diff --git a/src/xoshiro.c b/src/xoshiro.c new file mode 100644 index 00000000..c05e9405 --- /dev/null +++ b/src/xoshiro.c @@ -0,0 +1,42 @@ +/* Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org) + +To the extent possible under law, the author has dedicated all copyright +and related and neighboring rights to this software to the public domain +worldwide. This software is distributed without any warranty. + +See . */ + +#include +#include "xoshiro.h" + +/* This is xoshiro256** 1.0, one of our all-purpose, rock-solid + generators. It has excellent (sub-ns) speed, a state (256 bits) that is + large enough for any parallel application, and it passes all tests we + are aware of. + + For generating just floating-point numbers, xoshiro256+ is even faster. + + The state must be seeded so that it is not everywhere zero. If you have + a 64-bit seed, we suggest to seed a splitmix64 generator and use its + output to fill s. */ + +static inline uint64_t rotl(const uint64_t x, int k) { + return (x << k) | (x >> (64 - k)); +} + +uint64_t xoshiro(uint64_t s[4]) { + const uint64_t result = rotl(s[1] * 5, 7) * 9; + + const uint64_t t = s[1] << 17; + + s[2] ^= s[0]; + s[3] ^= s[1]; + s[1] ^= s[2]; + s[0] ^= s[3]; + + s[2] ^= t; + + s[3] = rotl(s[3], 45); + + return result; +}