123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include "Types.h"
- #include "Random.h"
- #include <stdio.h>
- uint32_t MurmurOAAT ( const void * blob, int len, uint32_t seed );
- //-----------------------------------------------------------------------------
- #if defined(_MSC_VER)
- #pragma optimize( "", off )
- #endif
- void blackhole ( uint32_t )
- {
- }
- uint32_t whitehole ( void )
- {
- return 0;
- }
- #if defined(_MSC_VER)
- #pragma optimize( "", on )
- #endif
- uint32_t g_verify = 1;
- void MixVCode ( const void * blob, int len )
- {
- g_verify = MurmurOAAT(blob,len,g_verify);
- }
- //-----------------------------------------------------------------------------
- bool isprime ( uint32_t x )
- {
- uint32_t p[] =
- {
- 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,
- 103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,
- 199,211,223,227,229,233,239,241,251
- };
- for(size_t i=0; i < sizeof(p)/sizeof(uint32_t); i++)
- {
- if((x % p[i]) == 0)
- {
- return false;
- }
- }
- for(int i = 257; i < 65536; i += 2)
- {
- if((x % i) == 0)
- {
- return false;
- }
- }
- return true;
- }
- void GenerateMixingConstants ( void )
- {
- Rand r(8350147);
- int count = 0;
- int trials = 0;
- int bitfail = 0;
- int popfail = 0;
- int matchfail = 0;
- int primefail = 0;
- //for(uint32_t x = 1; x; x++)
- while(count < 100)
- {
- //if(x % 100000000 == 0) printf(".");
- trials++;
- uint32_t b = r.rand_u32();
- //uint32_t b = x;
- //----------
- // must have between 14 and 18 set bits
- if(popcount(b) < 16) { b = 0; popfail++; }
- if(popcount(b) > 16) { b = 0; popfail++; }
- if(b == 0) continue;
- //----------
- // must have 3-5 bits set per 8-bit window
- for(int i = 0; i < 32; i++)
- {
- uint32_t c = ROTL32(b,i) & 0xFF;
- if(popcount(c) < 3) { b = 0; bitfail++; break; }
- if(popcount(c) > 5) { b = 0; bitfail++; break; }
- }
- if(b == 0) continue;
- //----------
- // all 8-bit windows must be different
- uint8_t match[256];
- memset(match,0,256);
- for(int i = 0; i < 32; i++)
- {
- uint32_t c = ROTL32(b,i) & 0xFF;
-
- if(match[c]) { b = 0; matchfail++; break; }
- match[c] = 1;
- }
- if(b == 0) continue;
- //----------
- // must be prime
- if(!isprime(b))
- {
- b = 0;
- primefail++;
- }
- if(b == 0) continue;
- //----------
- if(b)
- {
- printf("0x%08x : 0x%08x\n",b,~b);
- count++;
- }
- }
- printf("%d %d %d %d %d %d\n",trials,popfail,bitfail,matchfail,primefail,count);
- }
- //-----------------------------------------------------------------------------
|