Maison  >  Article  >  développement back-end  >  Comment l'utilisation des canaux par MaybeReadByte fournit-elle un comportement « aléatoire » dans Go ?

Comment l'utilisation des canaux par MaybeReadByte fournit-elle un comportement « aléatoire » dans Go ?

王林
王林avant
2024-02-06 09:55:03395parcourir

MaybeReadByte 对通道的使用如何在 Go 中提供“随机”行为?

Contenu de la question

Est-ce que l'un des Go crypto/rand 包中的 Prime 函数(生成可能的素数)中,它调用 crypto/internal/randutil 包中的 MaybeReadByte 函数(如下所示)。根据函数描述,我可以理解为什么使用它,但我不明白这个实现如何有 50% 的机会读取字节。难道不应该保证 case court avant l'autre ?

var (
    closedChanOnce sync.Once
    closedChan     chan struct{}
)

// MaybeReadByte reads a single byte from r with ~50% probability. This is used
// to ensure that callers do not depend on non-guaranteed behaviour, e.g.
// assuming that rsa.GenerateKey is deterministic w.r.t. a given random stream.
//
// This does not affect tests that pass a stream of fixed bytes as the random
// source (e.g. a zeroReader).
func MaybeReadByte(r io.Reader) {
    closedChanOnce.Do(func() {
        closedChan = make(chan struct{})
        close(closedChan)
    })

    select {
    case <-closedChan:
        return
    case <-closedChan:
        var buf [1]byte
        r.Read(buf[:])
    }
}

Bonne réponse


Non.

Selon cahier des charges:

Comme les deux case lisent la même chaîne, ils peuvent toujours le faire en même temps.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer