Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <stdint.h>
- #include <string.h>
- #include <pthread.h>
- #include <openssl/sha.h>
- typedef struct {
- int threadid;
- int iterations;
- uint64_t dataMin;
- unsigned char outputMin[64];
- } Setup;
- void* runSearch(void* context)
- {
- Setup* setup = context;
- uint64_t data = setup->threadid;
- unsigned char output[64];
- setup->dataMin = data;
- unsigned char* min = setup->outputMin;
- min[0] = 0xff;
- data &= 0x1f1f1f1f1f1f1f1fll;
- data |= 0x4040404040404040ll;
- for(int x=0 ; x<setup->iterations ; x++)
- {
- SHA512((unsigned char*)&data, 8, output);
- for(int i=0 ; i<64 ; i++)
- {
- if(output[i] < min[i])
- {
- memcpy(min, output, 64);
- setup->dataMin = data;
- break;
- }
- else if(output[i] > min[i])
- {
- break;
- }
- }
- data |= 0xe0e0e0e0e0e0e0e0ll;
- data += 8;
- data &= 0x1f1f1f1f1f1f1f1fll;
- data |= 0x4040404040404040ll;
- }
- return NULL;
- }
- Setup setups[8];
- int main(int argc, char** argv)
- {
- int iter = 1000000;
- int threadCount = 1;
- pthread_t threads[8];
- uint64_t dataMin;
- unsigned char outputMin[64] = {0xff};
- if(argc > 1) iter = atoi(argv[1]);
- if(argc > 2) threadCount = atoi(argv[2]);
- for(int i=0 ; i<threadCount ; i++)
- {
- setups[i] = (Setup){.threadid=i, .iterations=iter};
- pthread_create(&threads[i], NULL, runSearch, &setups[i]);
- }
- for(int i=0 ; i<threadCount ; i++)
- {
- pthread_join(threads[i], NULL);
- }
- for(int t=0 ; t<threadCount ; t++)
- {
- unsigned char* min = setups[t].outputMin;
- for(int i=0 ; i<64 ; i++)
- {
- if(min[i] < outputMin[i])
- {
- memcpy(&outputMin, min, 64);
- dataMin = setups[t].dataMin;
- break;
- }
- else if(min[i] > outputMin[i])
- {
- break;
- }
- }
- }
- for(int i=0 ; i<8 ; i++)
- printf("%c", ((char*)&dataMin)[i]);
- puts("");
- for(int i=0 ; i<64 ; i++)
- printf("%.2x", outputMin[i]);
- puts("");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement