【发布时间】:2019-08-24 14:20:51
【问题描述】:
在我们的网络应用程序中,我们使用外部服务来实现特定功能。要请求该外部服务,我们必须在请求标头中添加一个 key,它是一个整数,并且对我的所有请求都是唯一的,技术上称为 nonce
我使用了随机数生成
var nonce = (long) DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Ticks*100 + random.Next(100);
现在,在 100 个并发请求中,密钥被复制。密钥是如何复制的?
我不能使用 GUID,因为我需要不断增加整数值。
【问题讨论】:
-
时间不是随机数熵的良好来源。为什么不使用GUIDs?
-
如果您有真正的并发请求,那么
DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Ticks*100是这些请求的常量。那么你只剩下random.Next(100)了。那时发生碰撞并不需要太多。一个简单(但不理想)的选择是简单地做random.Next()。 -
@ArthurAttout 我需要不断增加整数值。
-
为什么需要它增加?根据您的要求(以及 Nonce 这个词的自然含义),该数字只需是唯一的。 GUID 将对此非常有用(它们不会是唯一的,但您发生冲突的可能性极低)
-
(顺便说一句,您的初始代码也不能保证您的号码会不断增加)