Xorshift (även " skiftregistergeneratorer ") är en klass av pseudo-slumptalsgeneratorer som upptäckts av George Marsaglia [1] . Generatorer av denna typ är en delmängd av linjära återkopplingsskiftregister (LFSR), vilket gör att de kan implementeras effektivt utan överdriven användning av glesa polynom [2] . Generering av nästa nummer i sekvensen sker genom att upprepade gånger XORing det aktuella numret och dess bitskifte , vilket gör xorshift extremt snabbt på modern datorarkitektur. Som alla LFSRs kräver xorshifts noggrant urval av initiala parametrar för att erhålla längre periodiska sekvenser [3] .
Xorshift-generatorer är bland de snabbaste kryptografiskt svaga slumptalsgeneratorerna, och deras implementering involverar inte stora mängder kod eller ihållande systemtillstånd. Även om de inte klarar alla statistiska test av slumpmässighet i sin råa form, är denna brist välkänd och kan lätt korrigeras genom att lägga till en icke-linjär funktion till deras struktur, vilket resulterar i generatorer som xorshift+ eller xorshift*. En C-implementering av xorshift+-generatorn som klarar alla tester i BigCrush-sviten (med en storleksordning färre fel än Mersenne Twist eller WELL ) kräver vanligtvis mindre än 10 cykler på x86 för att generera ett slumpmässigt tal på grund av instruktionspipelining [4] .
Scramblers, kända som + och *, är svaga i de låga bitarna [5] och är utformade för att generera flyttal, eftersom omvandling av ett slumpmässigt tal till ett reellt tal kastar bort de låga bitarna. I allmänhet tillåter scramblern ** (uttalas "starstar") att LFSR klarar tester på alla bitar.
Eftersom enkla xorshift-generatorer (utan ett icke-linjärt steg) misslyckas med flera statistiska test, anses de vara opålitliga [3] :360 .
Nedan är implementeringen av 128-bitarsversionen av xorshift i C . Ovanstående implementering lagrar fyra 32-bitars nummer som tillstånd och har en period på .
struktur xorshift128_state { uint32_t a , b , c , d ; }; /* Tillståndsmatrisen måste initieras för att inte bara vara noll */ uint32_t xorshift128 ( struct xorshift128_state * state ) { /* Algoritmen "xor128" från sid. 5 av Marsaglia, "Xorshift RNGs" */ uint32_t t = tillstånd -> d ; uint32_t const s = tillstånd -> a ; tillstånd -> d = tillstånd -> c ; tillstånd -> c = tillstånd -> b ; tillstånd -> b = s ; t ^= t << 11 ; t ^= t >> 8 ; returnera tillstånd -> a = t ^ s ^ ( s >> 19 ); }Den här implementeringen klarar de hårda testerna , men klarar inte MatrixRank- och LinearComp-testerna från BigCrush-testsviten i TestU01- paketet .