Olá!
Trago uma sugestão para melhora da performace: uso de um hashtable
Atualmente, para fazer a verificação se foi encontrado uma privateKey de uma wallet é dado pelo seguinte código:
func worker(wallets *Wallets, privKeyChan <-chan *big.Int, resultChan chan<- *big.Int, wg *sync.WaitGroup) {
defer wg.Done()
for privKeyInt := range privKeyChan {
address := btc_utils.CreatePublicHash160(privKeyInt)
if Contains(wallets.Addresses, address) {
select {
case resultChan <- privKeyInt:
return
default:
return
}
}
}
}
especificamente, a função Contains
em
if Contains(wallets.Addresses, address) {
select {
case resultChan <- privKeyInt:
return
default:
return
}
}
Essa função, é implementada da seguinte forma:
func Contains(slice [][]byte, item []byte) bool {
for _, a := range slice {
if bytes.Equal(a, item) {
return true
}
}
return false
}
A Complexidade de Tempo é linear, O(n)
onde n, nesse caso é quantidade de wallets.Addresses
. Por isso, nota-se uma melhora quando nesse vídeo deixa-se somente um endereço.
Uma forma de otimizar essa busca é usando Tabelas de Dispersão(Hash Table) que tem como característica principal a busca em tempo constante, O(1)
. Dado uma rápida lida da definição e da implementação dessa estrutura, é fácil ver como utilizar. Mas, vai aqui um resumo:
- Cria-se um função de hash para mapear o
address
em uma key;
- Preenche-se a tabela hash com os valores(hash gerado e
address
);
- Faz-se a busca pela chave. Se essa chave existir, então o
address
também existe.
Um estrutura built in do go que facilitará essa implementação é o map
Observação: Também é plemente possível, dado o uso do map, que a função de hash seja da seguinte forma address
-> address
pulando a necessidade de definição de uma função mais complexa.
Espero que tenha conseguido explicar bem a ideia.
Até.