在 .NET 中编写函数以基于种子生成 GUID 以便我对其唯一性更有信心的最简单方法是什么?
string GenerateSeededGuid(int seed) { /* code here */ }
理想情况下,种子将来自CryptGenRandom,它描述了它的随机数生成如下:
此函数生成的数据是加密随机的。它比典型的随机数生成器(例如 C 编译器附带的随机数生成器)生成的数据要随机得多。
此函数通常用于生成随机初始化向量 和盐值。
软件随机数生成器的工作方式基本相同。它们从一个称为种子的随机数开始,然后使用一种算法根据它生成一个伪随机位序列。这个过程中最困难的部分是得到一个真正随机的种子。这通常基于用户输入延迟或一个或多个硬件组件的抖动。
对于 Microsoft CSP,CryptGenRandom使用与其他安全组件相同的随机数生成器。这允许许多进程为系统范围的种子做出贡献。CryptoAPI 为每个用户存储一个中间随机种子。为了形成随机数生成器的种子,调用应用程序提供它可能具有的位(例如,鼠标或键盘计时输入),然后将这些位与存储的种子以及各种系统数据和用户数据(如进程 ID 和线程 ID、系统时钟、系统时间、系统计数器、内存状态、空闲磁盘集群、散列用户环境块。该结果用于播种伪随机数生成器 (PRNG)。[...] 如果一个应用程序可以访问一个好的随机源,它可以填充在调用CryptGenRandom之前带有一些随机数据的 pbBuffer缓冲区。然后,CSP 使用该数据进一步随机化其内部种子。在调用CryptGenRandom之前省略初始化 pbBuffer缓冲区的步骤是可以接受的。