我有一个存储请求的应用程序。
我在毫秒的时间跨度内收到多个请求。
我正在创建一个唯一的ID,例如
Random _r = new Random();
int n = _r.Next(9);
String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());
但是当多个请求以毫秒的时间跨度出现时。此唯一 ID 正在重复。
我用一个唯一的 id 存储这些请求。 但是如果请求在毫秒级的时间跨度内出现,它会重复
请帮帮我....如果我在任何地方都错了,请在某个地方建议我。
您需要从例程的每次执行中引用 1 个Random
实例。
public class Helper
{
Random _r = new Random();
public string GetUniqueId()
{
int n = _r.Next(9);
return String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());
}
}
您遇到了在短时间内实例化许多Random
时出现的问题。每个实例最终都有相同的种子值,因此它们的所有伪随机值系列都将相同。对所有调用使用 1 个实例可保证序列中的下一个值。
请注意,在一行中仍然获得相同值的可能性与 Next
的maxValue
参数的大小成反比。
Yo 应该在比运行方法的作用域更高的范围内定义和创建_r
。比,你的方法应该使用这个_r
实例,来获取其他随机生成的数字。
这将为您的案例生成一个唯一的 ID -
Random _r = new Random();
int n = _r.Next(9);
String.Format("{0}{1}", DateTime.Now.Ticks, n.ToString());
或者对于毫秒级精度,您可以使用
Random _r = new Random();
int n = _r.Next(9);
String.Format("{0:yyyyMMddHHmmssfff}{1}", DateTime.Now, n.ToString());
每次运行代码时,都会创建一个新的 Random 对象。关于随机对象的事情是它并不是真正的随机。如果您使用相同的值为其播种,它将为您提供相同的数字。因此,如果同时创建两个 Random 对象,它们将生成相同的值,因为没有参数的 Random() 构造函数使用当前时间作为种子。当前时间不是那么准确,因此在一小段时间跨度(大约 15 毫秒)内创建的所有 Random() 对象都将生成相同的数字序列,因为时间没有改变。
下面是如何修复它的示例 - 只需创建一次 Random 对象:
public class MyApp
{
private Random _r;
public MyApp()
{
this._r = new Random();
}
public handle_request()
{
int n = _r.Next(9);
String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());
}
}