Skip to content

Clean up RNG comparison table#100

Open
vks wants to merge 2 commits into
masterfrom
clean-up-rng-list
Open

Clean up RNG comparison table#100
vks wants to merge 2 commits into
masterfrom
clean-up-rng-list

Conversation

@vks
Copy link
Copy Markdown
Contributor

@vks vks commented May 17, 2026

What statements we made and didn't make for StdRng and SmallRng was inconsistent. Now, we only specify what we are willing to guarantee.

The full stats for the currently chosen algorithms are still there: ChaChaRng12 (newly added to the table) and Xoshiro256PlusPlus (unchanged) are part of the comparison.

Also state that rand_pcg now supports jump-ahead.

vks added 2 commits May 17, 2026 16:52
- Only state facts we are willing to commit to.
- Make sure to list the currently underlying algorithms with full
  statistics.

This way, we only communicate what we are willing to guarantee. As a
nice side effect, the comparison is less likely to go out of date if we
change the underlying algorithm of `StdRng` or `SmallRng`. This
happened for `SmallRng`, which until now stated an incorrect state size.

Fixes #58.
@vks
Copy link
Copy Markdown
Contributor Author

vks commented May 17, 2026

I still left the Initialization: fast statement for StdRng, but we could also remove it if we don't want to guarantee it.

Comment thread src/guide-rngs.md
| [`Pcg32`] | PCG XSH RR 64/32 (LCG) | 5 GB/s | 16 bytes | ★★★☆☆ | `u32` * 2<sup>64</sup> | |
| [`Pcg64`] | PCG XSL 128/64 (LCG) | 7 GB/s | 32 bytes | ★★★☆☆ | `u64` * 2<sup>128</sup> | |
| [`Pcg64Mcg`] | PCG XSL 128/64 (MCG) | 8 GB/s | 16 bytes | ★★★☆☆ | `u64` * 2<sup>126</sup> | |
| [`SmallRng`] | (unspecified) | (unspecified) | (unspecified) | ★★★☆☆ | ≥ `u32` * 2<sup>64</sup> | not portable |
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The purpose of SmallRng is to be a fast, low-memory PRNG. Maybe we should use inspecific words like 'fast', 'small' here? Or 'competitive'?

Comment thread src/guide-rngs.md
| name | full name | performance | initialization | memory | security (predictability) | forward secrecy |
|------|-----------|--------------|--------------|----------|----------------|-------------------------|
| [`StdRng`] | (unspecified) | 4.1 GB/s | fast | 136 bytes | widely trusted | no |
| [`StdRng`] | (unspecified) | (unspecified) | fast | (unspecified) | widely trusted | no |
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, performance is part of the selection criteria so could write 'fast'.

Comment thread src/guide-rngs.md
| [`StdRng`] | (unspecified) | (unspecified) | fast | (unspecified) | widely trusted | no |
| [`ChaCha20Rng`] | ChaCha20 | 2.6 GB/s | fast | 136 bytes | [rigorously analysed](https://tools.ietf.org/html/rfc7539#section-1) | no |
| [`ChaCha8Rng`] | ChaCha8 | 5.8 GB/s | fast | 136 bytes | small security margin | no |
| [`ChaCha12Rng`] | ChaCha12 | 4.1 GB/s | fast | 136 bytes | [large security margin](https://eprint.iacr.org/2019/1492) | no |
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I measure the size as 320 bytes now. I recall that the buffer size has been increased to better support some SIMD backends. This size is untested in the stream-ciphers repo.

Update this to 320 with a footnote clarifying that it may change?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants