Я пишу программу для максимально быстрого вычисления 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.
Можете ли вы, ребята, помочь мне понять, в чем будут различияусловия:
- производительность;
- вероятность получения коллизии (чего я хочу максимально избежать, хотя я знаю, что MD5 не криптографически безопасен).
В настоящее время я создаю [] байт размером 16, потому что (я думаю), который бы покрывал отображение MD5 (которое создает 16-байтовые хэши). Это оптимально или я должен использовать меньший / больший размер?
Обратите внимание, что цель состоит в том, чтобы найти хеш с конкретным 4-байтовым префиксом, и что я создаю кучу программ, которые выполняют этот код параллельно.