#include #include #include #include #include #include static unsigned long long tb0[64]; static long long getnow() { struct timeval tv; gettimeofday (&tv,NULL); return tv.tv_sec *1000000L + tv.tv_usec; } static void test_filltb0() { unsigned long long v=(unsigned long long)0xffffffffffffffffl; for (unsigned i=0; i<64; i++){ tb0[i] = v; v >>=1; } // for (unsigned i=0; i<16; i++) printf ("tb0[%u] = %016Lx\n",i,tb0[i]); } #if 0 static bool test_nbzero (int nb0, unsigned char *bufout) { bool ret = false; if (nb0 == 0){ ret = true; }else if (nb0 > 8){ ret = bufout[0] == 0 && test_nbzero(nb0-8,bufout+1); }else{ static unsigned char tb[]={ 00,0x7f }; ret = bufout[0] < tb[nb0]; } } #endif static bool test_nbzero (int nb0, const unsigned char *bufout) { union { unsigned char c[8]; unsigned long long v; }u; u.c[7] = bufout[0]; u.c[6] = bufout[1]; u.c[5] = bufout[2]; u.c[4] = bufout[3]; u.c[3] = bufout[4]; u.c[2] = bufout[5]; u.c[1] = bufout[6]; u.c[0] = bufout[7]; return tb0[nb0] > u.v; } int main (int argc, char *argv[]) { int ret = -1; if (argc == 2 && strcmp(argv[1],"genere")==0){ FILE *fin = fopen ("/dev/urandom","r"); if (fin == NULL){ fprintf (stderr,"Can't open /dev/urandom (%s)\n",strerror(errno)); }else{ unsigned char buf[8]; if (fread(buf,1,sizeof(buf),fin)!=sizeof(buf)){ fprintf (stderr,"Read error (%s)\n",strerror(errno)); }else{ for (unsigned i=0; i<8; i++) printf ("%02x",buf[i]); } struct timeval tv; gettimeofday (&tv,NULL); printf ("%ld%ld\n",tv.tv_sec,tv.tv_usec); ret = 0; fclose (fin); } }else if (argc != 3){ fprintf (stderr,"input nb0\n"); }else{ test_filltb0(); int nb0 = atoi(argv[2]); long long start = getnow(); int len = strlen(argv[1]); char buf[len+20]; strcpy (buf,argv[1]); for (unsigned i=0; i<4000000000; i++){ int n = sprintf (buf+len,",%u",i); SHA256_CTX ctx; SHA256_Init(&ctx); SHA256_Update(&ctx, buf, len+n); unsigned char bufout[BUFSIZ]; SHA256_Final(bufout, &ctx); if (test_nbzero(nb0,bufout)){ long long end = getnow(); printf ("%lfs %lfsum/s nb0=%d tb0[nb0]=%016Lx %12u %s: ",(double)(end-start)/1000000,(i/(double)(end-start))*1000000,nb0,tb0[nb0],i,buf); for (unsigned j = 0; j < SHA256_DIGEST_LENGTH; j++){ printf("%02x", bufout[j]); } putchar('\n'); ret = 0; break; } } } return ret; }