mirror of
https://github.com/stan220/godot-docs.git
synced 2026-09-08 20:29:03 +00:00
Merge pull request #8346 from Calinou/random-number-generation-csprng
Document cryptographically secure random number generation
This commit is contained in:
@@ -9,7 +9,9 @@ Godot.
|
||||
|
||||
After giving you a brief overview of useful functions that generate random
|
||||
numbers, you will learn how to get random elements from arrays, dictionaries,
|
||||
and how to use a noise generator in GDScript.
|
||||
and how to use a noise generator in GDScript. Lastly, we'll take a look at
|
||||
cryptographically secure random number generation and how it differs from
|
||||
typical random number generation.
|
||||
|
||||
.. note::
|
||||
|
||||
@@ -17,6 +19,9 @@ and how to use a noise generator in GDScript.
|
||||
`pseudorandom number generators
|
||||
<https://en.wikipedia.org/wiki/Pseudorandom_number_generator>`__ (PRNGs).
|
||||
|
||||
Godot internally uses the `PCG Family <https://www.pcg-random.org/>`__
|
||||
of pseudorandom number generators.
|
||||
|
||||
Global scope versus RandomNumberGenerator class
|
||||
-----------------------------------------------
|
||||
|
||||
@@ -34,6 +39,14 @@ the RandomNumberGenerator class.
|
||||
The randomize() method
|
||||
----------------------
|
||||
|
||||
.. note::
|
||||
|
||||
Since Godot 4.0, the random seed is automatically set to a random value when
|
||||
the project starts. This means you don't need to call ``randomize()`` in
|
||||
``_ready()`` anymore to ensure that results are random across project runs.
|
||||
However, you can still use ``randomize()`` if you want to use a specific
|
||||
seed number, or generate it using a different method.
|
||||
|
||||
In global scope, you can find a :ref:`randomize()
|
||||
<class_@GlobalScope_method_randomize>` method. **This method should be called only
|
||||
once when your project starts to initialize the random seed.** Calling it
|
||||
@@ -473,3 +486,48 @@ terrain. Godot provides :ref:`class_fastnoiselite` for this, which supports
|
||||
GD.Print(_noise.GetNoise1D(i));
|
||||
}
|
||||
}
|
||||
|
||||
Cryptographically secure pseudorandom number generation
|
||||
-------------------------------------------------------
|
||||
|
||||
So far, the approaches mentioned above are **not** suitable for
|
||||
*cryptographically secure* pseudorandom number generation (CSPRNG). This is fine
|
||||
for games, but this is not sufficient for scenarios where encryption,
|
||||
authentication or signing is involved.
|
||||
|
||||
Godot offers a :ref:`class_Crypto` class for this. This class can perform
|
||||
asymmetric key encryption/decryption, signing/verification, while also
|
||||
generating cryptographically secure random bytes, RSA keys, HMAC digests, and
|
||||
self-signed :ref:`class_X509Certificate`\ s.
|
||||
|
||||
The downside of :abbr:`CSPRNG (Cryptographically secure pseudorandom number generation)`
|
||||
is that it's much slower than standard pseudorandom number generation. Its API
|
||||
is also less convenient to use. As a result,
|
||||
:abbr:`CSPRNG (Cryptographically secure pseudorandom number generation)`
|
||||
should be avoided for gameplay elements.
|
||||
|
||||
Example of using the Crypto class to generate 2 random integers between ``0``
|
||||
and ``2^32 - 1`` (inclusive):
|
||||
|
||||
::
|
||||
|
||||
var crypto := Crypto.new()
|
||||
# Request as many bytes as you need, but try to minimize the amount
|
||||
# of separate requests to improve performance.
|
||||
# Each 32-bit integer requires 4 bytes, so we request 8 bytes.
|
||||
var byte_array := crypto.generate_random_bytes(8)
|
||||
|
||||
# Use the ``decode_u32()`` method from PackedByteArray to decode a 32-bit unsigned integer
|
||||
# from the beginning of `byte_array`. This method doesn't modify `byte_array`.
|
||||
var random_int_1 := byte_array.decode_u32(0)
|
||||
# Do the same as above, but with an offset of 4 bytes since we've already decoded
|
||||
# the first 4 bytes previously.
|
||||
var random_int_2 := byte_array.decode_u32(4)
|
||||
|
||||
prints("Random integers:", random_int_1, random_int_2)
|
||||
|
||||
.. seealso::
|
||||
|
||||
See :ref:`class_PackedByteArray`'s documentation for other methods you can
|
||||
use to decode the generated bytes into various types of data, such as
|
||||
integers or floats.
|
||||
|
||||
Reference in New Issue
Block a user