forked from martijnvanbrummelen/nwipe
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request martijnvanbrummelen#398 from chkboom/isaac64
Added ISAAC-64 PRNG for 64-bit systems.
- Loading branch information
Showing
9 changed files
with
331 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
/* | ||
------------------------------------------------------------------------------ | ||
isaac64.c: My random number generator for 64-bit machines. | ||
By Bob Jenkins, 1996. Public Domain. | ||
------------------------------------------------------------------------------ | ||
*/ | ||
#ifndef STANDARD | ||
#include "isaac_standard.h" | ||
#endif | ||
#ifndef ISAAC64 | ||
#include "isaac64.h" | ||
#endif | ||
|
||
|
||
#define ind(mm,x) (*(ub8 *)((ub1 *)(mm) + ((x) & ((RANDSIZ-1)<<3)))) | ||
#define rngstep(mix,a,b,mm,m,m2,r,x) \ | ||
{ \ | ||
x = *m; \ | ||
a = (mix) + *(m2++); \ | ||
*(m++) = y = ind(mm,x) + a + b; \ | ||
*(r++) = b = ind(mm,y>>RANDSIZL) + x; \ | ||
} | ||
|
||
void isaac64(rand64ctx *ctx) | ||
{ | ||
register ub8 a,b,x,y,*m,*mm,*m2,*r,*mend; | ||
mm=ctx->mm; r=ctx->randrsl; | ||
a = ctx->aa; b = ctx->bb + (++ctx->cc); | ||
for (m = mm, mend = m2 = m+(RANDSIZ/2); m<mend; ) | ||
{ | ||
rngstep(~(a^(a<<21)), a, b, mm, m, m2, r, x); | ||
rngstep( a^(a>>5) , a, b, mm, m, m2, r, x); | ||
rngstep( a^(a<<12) , a, b, mm, m, m2, r, x); | ||
rngstep( a^(a>>33) , a, b, mm, m, m2, r, x); | ||
} | ||
for (m2 = mm; m2<mend; ) | ||
{ | ||
rngstep(~(a^(a<<21)), a, b, mm, m, m2, r, x); | ||
rngstep( a^(a>>5) , a, b, mm, m, m2, r, x); | ||
rngstep( a^(a<<12) , a, b, mm, m, m2, r, x); | ||
rngstep( a^(a>>33) , a, b, mm, m, m2, r, x); | ||
} | ||
ctx->bb = b; ctx->aa = a; | ||
} | ||
|
||
#define mix(a,b,c,d,e,f,g,h) \ | ||
{ \ | ||
a-=e; f^=h>>9; h+=a; \ | ||
b-=f; g^=a<<9; a+=b; \ | ||
c-=g; h^=b>>23; b+=c; \ | ||
d-=h; a^=c<<15; c+=d; \ | ||
e-=a; b^=d>>14; d+=e; \ | ||
f-=b; c^=e<<20; e+=f; \ | ||
g-=c; d^=f>>17; f+=g; \ | ||
h-=d; e^=g<<14; g+=h; \ | ||
} | ||
|
||
void rand64init(rand64ctx *ctx, word flag) | ||
{ | ||
word i; | ||
ub8 a,b,c,d,e,f,g,h; | ||
ub8 *mm, *randrsl; | ||
ctx->aa = ctx->bb = ctx->cc = (ub8)0; | ||
mm=ctx->mm; | ||
randrsl=ctx->randrsl; | ||
a=b=c=d=e=f=g=h=0x9e3779b97f4a7c13LL; /* the golden ratio */ | ||
|
||
for (i=0; i<4; ++i) /* scramble it */ | ||
{ | ||
mix(a,b,c,d,e,f,g,h); | ||
} | ||
|
||
for (i=0; i<RANDSIZ; i+=8) /* fill in mm[] with messy stuff */ | ||
{ | ||
if (flag) /* use all the information in the seed */ | ||
{ | ||
a+=randrsl[i ]; b+=randrsl[i+1]; c+=randrsl[i+2]; d+=randrsl[i+3]; | ||
e+=randrsl[i+4]; f+=randrsl[i+5]; g+=randrsl[i+6]; h+=randrsl[i+7]; | ||
} | ||
mix(a,b,c,d,e,f,g,h); | ||
mm[i ]=a; mm[i+1]=b; mm[i+2]=c; mm[i+3]=d; | ||
mm[i+4]=e; mm[i+5]=f; mm[i+6]=g; mm[i+7]=h; | ||
} | ||
|
||
if (flag) | ||
{ /* do a second pass to make all of the seed affect all of mm */ | ||
for (i=0; i<RANDSIZ; i+=8) | ||
{ | ||
a+=mm[i ]; b+=mm[i+1]; c+=mm[i+2]; d+=mm[i+3]; | ||
e+=mm[i+4]; f+=mm[i+5]; g+=mm[i+6]; h+=mm[i+7]; | ||
mix(a,b,c,d,e,f,g,h); | ||
mm[i ]=a; mm[i+1]=b; mm[i+2]=c; mm[i+3]=d; | ||
mm[i+4]=e; mm[i+5]=f; mm[i+6]=g; mm[i+7]=h; | ||
} | ||
} | ||
|
||
isaac64(ctx); /* fill in the first set of results */ | ||
ctx->randcnt=RANDSIZ; /* prepare to use the first set of results */ | ||
} | ||
|
||
#ifdef NEVER | ||
int main() | ||
{ | ||
ub8 i,j; | ||
rand64ctx ctx; | ||
ctx.aa=ctx.bb=ctx.cc=(ub8)0; | ||
for (i=0; i<RANDSIZ; ++i) ctx.mm[i]=(ub8)0; | ||
rand64init(&ctx, TRUE); | ||
for (i=0; i<2; ++i) | ||
{ | ||
isaac64(&ctx); | ||
for (j=0; j<RANDSIZ; ++j) | ||
{ | ||
printf("%.8lx%.8lx",(ub4)(ctx.randrsl[j]>>32),(ub4)ctx.randrsl[j]); | ||
if ((j&3)==3) printf("\n"); | ||
} | ||
} | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* | ||
------------------------------------------------------------------------------ | ||
isaac64.h: definitions for a random number generator | ||
Bob Jenkins, 1996, Public Domain | ||
------------------------------------------------------------------------------ | ||
*/ | ||
#ifndef ISAAC64 | ||
#define ISAAC64 | ||
|
||
#include "isaac_standard.h" | ||
|
||
struct rand64ctx | ||
{ | ||
ub8 randrsl[RANDSIZ], randcnt; | ||
ub8 mm[RANDSIZ]; | ||
ub8 aa, bb, cc; | ||
}; | ||
typedef struct rand64ctx rand64ctx; | ||
|
||
/* | ||
------------------------------------------------------------------------------ | ||
If (flag==TRUE), then use the contents of randrsl[0..255] as the seed. | ||
------------------------------------------------------------------------------ | ||
*/ | ||
void rand64init(rand64ctx *r, word flag); | ||
|
||
void isaac64(rand64ctx *ctx); | ||
|
||
|
||
/* | ||
------------------------------------------------------------------------------ | ||
Call rand64() to retrieve a single 64-bit random value | ||
------------------------------------------------------------------------------ | ||
*/ | ||
#define isaac64_rand() \ | ||
(!(r)->randcnt-- ? \ | ||
(isaac64(r), (r)->randcnt=RANDSIZ-1, (r)->randrsl[(r)->>randcnt]) : \ | ||
(r)->randrsl[(r)->randcnt]) | ||
|
||
#endif /* ISAAC64 */ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.