Является ли более эффективным всегда генерировать случайные байты или генерировать один раз, преобразовать в uint64, увеличить и преобразовать обратно в байты? - PullRequest
0 голосов
/ 28 октября 2019

Я пишу программу для максимально быстрого вычисления MD5-хэшей. На данный момент у меня есть цикл, который запускает этот код:

var coinBlob = make([]byte, 97)

func main() {
    wait := make(chan []byte, 1)
    for i:= 0; i < runtime.NumCPU(); i++ {
        go Find()
    }
    <- wait
}

func Find() {
    for {
        Generate(coinBlob)
    }
}

func Generate(coinBlob []byte) {
    randomBytes := make([]byte, 16)
    _, _ = rand.Read(randomBytes)
    copy(coinBlob[49:], randomBytes)
    md5h := md5.New()
    md5h.Write(coinBlob)
    coin := md5h.Sum(nil)
    for i := 0; i <= 4; i++ {
        if coin[i] != 0 {
            return
        }
    }
    fmt.Printf("Found: %s", hex.EncodeToString(coin))
}

, но так как я сосредоточен на производительности, я спорю, будет ли быстрее генерировать случайный [] байтовый массив (хотяразмером 8), конвертируйте его в uint64, увеличивайте его в цикле, а затем конвертируйте обратно в [] байт и используйте его для вычисления MD5.

Можете ли вы, ребята, помочь мне понять, в чем будут различияусловия:

  1. производительность;
  2. вероятность получения коллизии (чего я хочу максимально избежать, хотя я знаю, что MD5 не криптографически безопасен).

В настоящее время я создаю [] байт размером 16, потому что (я думаю), который бы покрывал отображение MD5 (которое создает 16-байтовые хэши). Это оптимально или я должен использовать меньший / больший размер?

Обратите внимание, что цель состоит в том, чтобы найти хеш с конкретным 4-байтовым префиксом, и что я создаю кучу программ, которые выполняют этот код параллельно.

...