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