#include "Types.h" #include "Random.h" #include 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) fprintf(stderr,"."); 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) { fprintf(stderr,"0x%08x : 0x%08x\n",b,~b); count++; } } fprintf(stderr,"%d %d %d %d %d %d\n",trials,popfail,bitfail,matchfail,primefail,count); } //-----------------------------------------------------------------------------