Crypto.generate_random_bytes
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Crypto.generate_random_bytes
Crypto.generate_random_bytes
定义
Crypto.generate_random_bytes 用来生成一组"真正随机"的字节。不是那种伪随机(看起来随机但其实有规律可循),而是密码学级别的安全随机数——即使知道算法也很难预测下一个是什么。
打个比方:普通随机数就像抛硬币,虽然结果看起来随机,但如果知道抛硬币的力度和角度,理论上可以预测。而密码学随机数就像从宇宙射线的噪声中取随机值——完全无法预测。
在实际游戏开发中,密码学随机数用于:生成会话令牌(Token)、生成盐值(Salt)、创建临时密码、生成加密密钥等安全相关场景。普通的游戏随机(如敌人掉落物品)用 GD.RandRange() 就够了,不需要这么高级的。
函数签名
C#
public PackedByteArray GenerateRandomBytes(int size)GDScript
func generate_random_bytes(size: int) -> PackedByteArray参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
size | int | 是 | 要生成的随机字节数量。每个字节是 0-255 之间的随机数 |
返回值
PackedByteArray —— 包含指定数量随机字节的数组。每个字节的值在 0 到 255 之间。
代码示例
基础用法:生成随机字节
C#
var crypto = new Godot.Crypto();
// 生成 16 个随机字节
PackedByteArray randomBytes = crypto.GenerateRandomBytes(16);
GD.Print($"生成了 {randomBytes.Count} 个随机字节");
GD.Print($"十六进制:{randomBytes.HexEncode()}");
// 运行结果: 打印类似 "十六进制:a3f2b1c04d8e7f921b5a6c3d0e4f8a7b"GDScript
var crypto = Crypto.new()
# 生成 16 个随机字节
var random_bytes = crypto.generate_random_bytes(16)
print("生成了 %d 个随机字节" % random_bytes.size())
print("十六进制:%s" % random_bytes.hex_encode())
# 运行结果: 打印类似 "十六进制:a3f2b1c04d8e7f921b5a6c3d0e4f8a7b"实际场景:生成用户会话令牌和盐值
C#
using Godot;
public partial class SecurityManager : Node
{
private Godot.Crypto _crypto = new();
public string GenerateSessionToken()
{
// 生成 32 字节的随机令牌
PackedByteArray bytes = _crypto.GenerateRandomBytes(32);
return bytes.HexEncode();
// 运行结果: 返回 64 字符的随机十六进制字符串,如 "f3a2...8b1c"
}
public string GenerateSalt()
{
// 生成 16 字节的随机盐值
PackedByteArray bytes = _crypto.GenerateRandomBytes(16);
return bytes.HexEncode();
// 运行结果: 返回 32 字符的随机盐值
}
public string GenerateTemporaryPassword()
{
// 生成 8 字节随机数据,转为 Base64 作为临时密码
PackedByteArray bytes = _crypto.GenerateRandomBytes(8);
return Marshalls.RawToBase64(bytes);
// 运行结果: 返回类似 "8jKxPq2F" 的临时密码
}
}GDScript
extends Node
var _crypto := Crypto.new()
func generate_session_token() -> String:
# 生成 32 字节的随机令牌
var bytes = _crypto.generate_random_bytes(32)
return bytes.hex_encode()
# 运行结果: 返回 64 字符的随机十六进制字符串
func generate_salt() -> String:
# 生成 16 字节的随机盐值
var bytes = _crypto.generate_random_bytes(16)
return bytes.hex_encode()
# 运行结果: 返回 32 字符的随机盐值
func generate_temporary_password() -> String:
# 生成 8 字节随机数据,转为 Base64 作为临时密码
var bytes = _crypto.generate_random_bytes(8)
return Marshalls.raw_to_base64(bytes)
# 运行结果: 返回类似 "8jKxPq2F" 的临时密码进阶用法:生成随机房间代码
C#
using Godot;
using System.Text;
public partial class RoomCodeGenerator : Node
{
private Godot.Crypto _crypto = new();
private const string Charset = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // 排除容易混淆的字符
public string GenerateRoomCode(int length = 6)
{
PackedByteArray randomBytes = _crypto.GenerateRandomBytes(length);
var code = new StringBuilder();
for (int i = 0; i < length; i++)
{
int index = randomBytes[i] % Charset.Length;
code.Append(Charset[index]);
}
GD.Print($"生成房间代码:{code}");
// 运行结果: 打印类似 "生成房间代码:K7NP2H"
return code.ToString();
}
public string[] GenerateMultipleCodes(int count, int length = 6)
{
var codes = new string[count];
for (int i = 0; i < count; i++)
{
codes[i] = GenerateRoomCode(length);
}
GD.Print($"生成了 {count} 个房间代码");
// 运行结果: 生成多个不重复的房间代码
return codes;
}
}GDScript
extends Node
var _crypto := Crypto.new()
const CHARSET := "ABCDEFGHJKLMNPQRSTUVWXYZ23456789" # 排除容易混淆的字符
func generate_room_code(length: int = 6) -> String:
var random_bytes = _crypto.generate_random_bytes(length)
var code := ""
for i in range(length):
var index = random_bytes[i] % CHARSET.length()
code += CHARSET[index]
print("生成房间代码:%s" % code)
# 运行结果: 打印类似 "生成房间代码:K7NP2H"
return code
func generate_multiple_codes(count: int, length: int = 6) -> Array:
var codes: Array = []
for i in range(count):
codes.append(generate_room_code(length))
print("生成了 %d 个房间代码" % count)
# 运行结果: 生成多个不重复的房间代码
return codes注意事项
- 需要创建 Crypto 实例:必须先用
new Crypto()创建实例才能调用此方法。它是一个静态工具类。 - 密码学安全 vs 伪随机:
Crypto.generate_random_bytes是密码学安全的随机数,比GD.RandRange()等伪随机函数更安全。但性能开销也更大,不要在每帧调用。 - 不要用于普通游戏随机:普通的游戏随机(如敌人掉落率、随机地图生成)用
GD.RandRange()或RandomNumberGenerator即可,不需要密码学级别的随机数。 - C# 的替代方案:C# 中也可以用
System.Security.Cryptography.RandomNumberGenerator.GetBytes(size)生成密码学随机数。 - HexEncode 转为可读字符串:
PackedByteArray.HexEncode()方法可以把随机字节转为十六进制字符串,方便显示和传输。
