github.com/anacrolix/torrent@v1.61.0/smartban_test.go (about)

     1  package torrent
     2  
     3  import (
     4  	"crypto/sha1"
     5  	"net/netip"
     6  	"testing"
     7  
     8  	"github.com/anacrolix/missinggo/v2/iter"
     9  	"github.com/cespare/xxhash"
    10  
    11  	"github.com/anacrolix/torrent/smartban"
    12  )
    13  
    14  func benchmarkSmartBanRecordBlock[Sum comparable](b *testing.B, hash func([]byte) Sum) {
    15  	var cache smartban.Cache[bannableAddr, RequestIndex, Sum]
    16  	cache.Hash = hash
    17  	cache.Init()
    18  	var data [defaultChunkSize]byte
    19  	var addr netip.Addr
    20  	b.SetBytes(int64(len(data)))
    21  	for i := range iter.N(b.N) {
    22  		cache.RecordBlock(addr, RequestIndex(i), data[:])
    23  	}
    24  }
    25  
    26  func BenchmarkSmartBanRecordBlock(b *testing.B) {
    27  	b.Run("xxHash", func(b *testing.B) {
    28  		var salt [8]byte
    29  		benchmarkSmartBanRecordBlock(b, func(block []byte) uint64 {
    30  			h := xxhash.New()
    31  			// xxHash is not cryptographic, and so we're salting it so attackers can't know a priori
    32  			// where block data collisions are.
    33  			h.Write(salt[:])
    34  			h.Write(block)
    35  			return h.Sum64()
    36  		})
    37  	})
    38  	b.Run("Sha1", func(b *testing.B) {
    39  		benchmarkSmartBanRecordBlock(b, sha1.Sum)
    40  	})
    41  }