mit-ocw

Source code for MIT-OCW coursework
git clone git://git.laack.co/mit-ocw.git
Log | Files | Refs

main.go (1184B)


      1 package main
      2 
      3 import (
      4 	"crypto/rand"
      5 	"crypto/sha256"
      6 	"encoding/hex"
      7 	"flag"
      8 	"fmt"
      9 	"sync"
     10 )
     11 
     12 var done = false
     13 var final = ""
     14 
     15 func hashPrefixMatches(message string, prefix string) bool {
     16 
     17 	result := sha256.Sum256([]byte(message + "\n")) // echo adds this by default
     18 	resString := hex.EncodeToString(result[:])
     19 
     20 	for idx, _ := range prefix {
     21 		if prefix[idx] != resString[idx]{
     22 			return false
     23 		}
     24 	}
     25 
     26 	return true
     27 }
     28 
     29 func worker(message string, prefix string, wg *sync.WaitGroup) {
     30 
     31 	defer wg.Done()
     32 
     33 	for done == false {
     34 		text := message + rand.Text()
     35 
     36 		if hashPrefixMatches(text, prefix) {
     37 			fmt.Println("Good: " + text)
     38 			done = true
     39 			final = text
     40 			return
     41 		} else {
     42 			continue
     43 		}
     44 	}
     45 }
     46 
     47 
     48 func main() {
     49 
     50 	// andrew - 3GFR44CIP4GFICNCAIL6NE7Q2W
     51 	// 9 zeroes
     52 	zeroesPtr := flag.Int("zeroes", 5, "Number of zeroes prefixed on sha256sum")
     53 
     54 	flag.Parse()
     55 
     56 	if len(flag.Args()) > 1 {
     57 		panic("Unexpected number of arguments")
     58 	}
     59 
     60 	message := flag.Args()[0] + " - "
     61 	zeroes := *zeroesPtr
     62 
     63 	prefix := ""
     64 
     65 	for i := 0 ; i < zeroes ; i++ {
     66 		prefix += "0"
     67 	}
     68 	
     69 	wg := sync.WaitGroup{}
     70 
     71 	for i := 0; i < 200; i++ {
     72 		wg.Add(1)
     73 		go worker(message, prefix, &wg)
     74 	}
     75 	wg.Wait()
     76 
     77 
     78 }