You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
1.7 KiB
102 lines
1.7 KiB
package main
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"math/rand"
|
|
"sort"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
|
|
trialset := []int{}
|
|
numtrials := 100
|
|
for i := 0; i < numtrials; i++ {
|
|
trialset = append(trialset, hashTrial())
|
|
}
|
|
|
|
fmt.Println("Mean Trials: " + fmt.Sprint(mean(trialset)))
|
|
fmt.Println()
|
|
fmt.Println("Median Trials: " + fmt.Sprint(median(trialset)))
|
|
fmt.Println()
|
|
|
|
}
|
|
|
|
func median(numbers []int) float64 {
|
|
sort.Ints(numbers)
|
|
n := len(numbers)
|
|
if n%2 == 0 {
|
|
return float64(numbers[n/2-1]+numbers[n/2]) / 2
|
|
}
|
|
return float64(numbers[n/2])
|
|
}
|
|
|
|
func mean(numbers []int) float64 {
|
|
var sum int
|
|
for _, n := range numbers {
|
|
sum += n
|
|
}
|
|
return float64(sum) / float64(len(numbers))
|
|
}
|
|
|
|
func hashTrial() int {
|
|
|
|
// puzzle difficulty
|
|
difficulty := 5
|
|
|
|
// string to match leading zeros
|
|
m := ""
|
|
for i := 0; i < difficulty; i++ {
|
|
m += "0"
|
|
}
|
|
|
|
// counter for number of trials
|
|
trials := 1
|
|
|
|
// original message to hash
|
|
s := "Hello"
|
|
|
|
// random seed using time and generation of a nonce
|
|
rand.Seed(time.Now().UnixNano())
|
|
nonce := rand.Intn(1000000)
|
|
|
|
// compute first sha256
|
|
h := sha256.New()
|
|
p := string(s) + " " + fmt.Sprint(nonce)
|
|
|
|
h.Write([]byte(p))
|
|
|
|
fmt.Println()
|
|
fmt.Println(s)
|
|
fmt.Println()
|
|
fmt.Println(p)
|
|
fmt.Println()
|
|
fmt.Println(hex.EncodeToString(h.Sum(nil)))
|
|
fmt.Println()
|
|
|
|
// compute sha256 until leading zeros are found
|
|
for string(hex.EncodeToString(h.Sum(nil))[:difficulty]) != m {
|
|
|
|
h.Reset()
|
|
|
|
nonce++
|
|
p = string(s) + " " + fmt.Sprint(nonce)
|
|
h.Write([]byte(p))
|
|
|
|
fmt.Println(p)
|
|
fmt.Println()
|
|
fmt.Println(hex.EncodeToString(h.Sum(nil)))
|
|
fmt.Println()
|
|
|
|
trials++
|
|
|
|
}
|
|
|
|
fmt.Println("Trials: " + fmt.Sprint(trials))
|
|
fmt.Println()
|
|
|
|
return trials
|
|
|
|
}
|
|
|