1

我有一个存储请求的应用程序。

我在几毫秒的时间内收到多个请求。

我正在创建一个唯一 ID,例如

Random _r = new Random();
int n = _r.Next(9);
String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());

但是当多个请求以毫秒为时间跨度时。这个 UniqueID 正在重复。

我用一个唯一的 ID 存储这些请求。但是如果请求在毫秒的时间跨度内出现,它会重复

请帮助我......如果我在任何地方错了,请在某个地方建议我......

4

4 回答 4

2

您需要Random从例程的每次执行中引用 1 个实例。

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当您在一个小间隔内实例化许多 s 时,您会遇到问题。每个实例最终都具有相同的种子值,因此它们的所有伪随机值系列都是相同的。对所有调用使用 1 个实例可以保证系列中的下一个值。

maxValue请注意,仍然连续获得相同值的可能性与 的参数的大小成反比Next

于 2013-10-07T15:41:07.093 回答
0

Yo 应该_r在比运行您的方法的范围更高的范围内定义和创建。比,您的方法应该使用 , 的这个实例_r来获取其他随机生成的数字。

于 2013-10-07T15:40:53.627 回答
0

这将为您的案例生成一个唯一 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());
于 2013-10-07T15:44:25.073 回答
0

每次运行代码时,都会创建一个新的 Random 对象。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());
    }
}
于 2013-10-07T15:59:38.343 回答