我需要在分布式系统中生成标识符.
系统将检测到重复项,并导致创建该标识符的操作失败.我需要通过生成具有低冲突概率的标识符来最小化操作失败的可能性.
我还希望能够以数学方式描述生成重复数字的可能性.我不确定这样的描述是什么样的,最好我想知道这样X的东西:
当每秒生成1000个随机数10年时,应该生成不超过X个重复项.
这些随机数只能有35个有效位.该系统使用C#编写,并在Microsoft的.NET平台上运行.
所以这实际上是两个任务中的一个(但我想它们彼此依赖):
我应该使用什么组件/模式来生成标识符?
我该如何计算该X值?
(1)我看到以下候选人:
我需要数字有35个有效位的事实在生成值时不是问题,因为生成更大的数字然后只提取其中的35个就可以了.但是,它确实会影响我推测的数学计算.
UPDATE
我现在可以看到,对于我上面的描述,35位还不够.10年内我真的不需要每毫秒1个数字.这是一种夸大其词.
我真正需要的是一种分布式生成具有35个有效位且具有尽可能低冲突概率的标识符的方法.随着时间的推移,系统将"清理"标识符,以便可以再次使用相同的数字,而不会导致失败.
我知道我当然可以实施某种集中计数器.但我希望能够尽可能避免这种情况.我想最小化维护标识符所需的网络操作数量.
欢迎任何建议!
您希望每10秒钟生成1000个数字.所以你会产生
1000*60*60*365*10 = 315360000000
Run Code Online (Sandbox Code Playgroud)
您想使用35位数字.有
2**35 = 34359738368
Run Code Online (Sandbox Code Playgroud)
您将生成的最小重复项数为315360000000 - 34359738368,等于281000261632.这是X的下限.这是不言而喻的.假设一些惊人的怪物,你设法从2**35可用的每个可能值中取样.然后,您制作的每个其他样本都是重复的.
我想我们可以得出结论,35位是不够的.
就产生高质量的伪随机数而言,显而易见的是System.Security.Cryptography.RNGCryptoServiceProvider,你提出的三种最佳选择.
如果你真的想要唯一性我建议你做以下事情:
如果唯一性很重要,这确实是最好的策略.但是您可能需要为您的ID专用更多位.