mirror of
https://github.com/coredns/coredns.git
synced 2025-10-27 16:24:19 -04:00
Add test suite covering thread-safe random number generator with tests for: - Constructor with various seed values (positive, zero, negative) - Deterministic behavior verification with same seeds - Permutation generation and validation - Concurrent access safety with multiple goroutines - Mixed operations under concurrent load Also clarify package documentation to explicitly state this is for load balancing and server selection, not cryptographic use. The math/rand usage is intentional for performance in non-security contexts like upstream server selection and DNS record shuffling. Signed-off-by: Ville Vesilehto <ville@vesilehto.fi>
39 lines
962 B
Go
39 lines
962 B
Go
// Package rand is used for concurrency safe random number generator.
|
|
// This package provides a thread-safe wrapper around math/rand for use in
|
|
// load balancing and server selection. It is NOT suitable for cryptographic
|
|
// purposes and should not be used for security-sensitive operations.
|
|
package rand
|
|
|
|
import (
|
|
"math/rand"
|
|
"sync"
|
|
)
|
|
|
|
// Rand is used for concurrency safe random number generator.
|
|
type Rand struct {
|
|
m sync.Mutex
|
|
r *rand.Rand
|
|
}
|
|
|
|
// New returns a new Rand from seed.
|
|
func New(seed int64) *Rand {
|
|
return &Rand{r: rand.New(rand.NewSource(seed))}
|
|
}
|
|
|
|
// Int returns a non-negative pseudo-random int from the Source in Rand.r.
|
|
func (r *Rand) Int() int {
|
|
r.m.Lock()
|
|
v := r.r.Int()
|
|
r.m.Unlock()
|
|
return v
|
|
}
|
|
|
|
// Perm returns, as a slice of n ints, a pseudo-random permutation of the
|
|
// integers in the half-open interval [0,n) from the Source in Rand.r.
|
|
func (r *Rand) Perm(n int) []int {
|
|
r.m.Lock()
|
|
v := r.r.Perm(n)
|
|
r.m.Unlock()
|
|
return v
|
|
}
|