生成唯一的随机数

时间:2012-10-05 16:02:29

标签: c# asp.net

我将学生ID作为randon号码输入到数据库

  int num = r.Next(1000);
  Session["number"] = "SN" + (" ") + num.ToString();

但是有没有机会获得重复的数字?我怎么能避免这个?

编辑::我有一个标识列,学生ID与ID分开,我将从UI输入一个随机的学生ID进入数据库。

9 个答案:

答案 0 :(得分:7)

在DB中创建一个仅仅是整数唯一ID的列是一项非常的常见任务。以至于我曾经使用过的每个数据库都有一个特定的列类型,函数等来处理它。它会根据您使用的任何特定数据库而有所不同,但您应该弄清楚它是什么并使用它。

  • 您需要一个唯一的值随机。两者是不同的。随机数重复,它们不是唯一的。唯一数字也不是随机的。例如,如果你只是从0增加数字,它将是唯一的,但这不是随机的。
  • 您可以使用GUID,它将是唯一的,但它将是128位。那太大了。大多数数据库只有一个计数器,每次添加项目时它们都会递增,所以32位通常就足够了。这将为您节省大量空间。递增计数器也比计算GUID的新值更快。对于往往涉及添加大量项目的数据库操作,这可能很重要。
  • 正如Jodrell在评论中提到的那样,如果使用GUID或其他大字段,还应考虑索引的大小。使用需要更多位的列来存储和维护该索引将会更加昂贵(在时间和空间上)。
  • 如果你自己尝试做某事,你很可能会做错。要么你的算法不是完全唯一的,它会因同步不当而产生竞争条件,由于过度同步会导致性能下降,它会大得多,因为它是降低碰撞风险所需要的,等等。当天结束时,数据库可以访问您不使用的工具;让它照顾它,所以你不必担心你会搞砸什么。

答案 1 :(得分:3)

你可以使用Guid而不是随机int,它们将始终是唯一的

没有办法保证int是唯一的,除非你检查每一个已经存在的东西,即便如此 - 就像评论所说,当你传递1000个ids时,你是保证重复的

编辑:

我提到我认为Guid在这里是最好的,因为这个问题,首先索引表格不会花费很长时间 - 假设由于int的大小,将会有不到1000名学生,在一个少于1000行的表中,128位是很好的。

Guid是一件好事,即使它们并不总是最有效的方式

在c#中创建一个独特的Guid有一个好处,你可以继续使用并显示该ID - 就像在问题中一样,没有再去Db去找出分配给学生的唯一ID

答案 2 :(得分:3)

当然,您很可能会获得重复的号码。接下来只是给你一个0到1000之间的数字,但不能保证这个数字不会是Next过去返回的那个数字。

如果您尝试使用唯一值,请查看可能使用Guids而不是整数,或者使用不断增加的整数值而不是任意随机数。这里是Guid的参考页面 http://msdn.microsoft.com/en-us/library/system.guid.aspx

答案 3 :(得分:2)

是的,你会得到重复的。如果您想要一个真正独特的项目,您将需要使用Guid。如果您仍想使用数字,则需要跟踪已使用的数字,类似于数据库中的标识列。

答案 4 :(得分:2)

是的,你肯定会得到重复的。您可以使用GUID代替:

Guid g = Guid.NewGuid();

GUID理论上是“全球唯一”。

答案 5 :(得分:2)

您可以尝试使用Guid生成ID:

Session["number"] = "SN" + (" ") + Guid.NewGuid().ToString();

它会大大降低获得重复ID的机会。

答案 6 :(得分:1)

如果你使用随机数,那么没有办法避免它。总会有碰撞的可能性。

我认为您可能正在寻找的是Identity列,或者与您的数据库服务器等效的列。

答案 7 :(得分:1)

在LINQ to SQL中,可以像这样设置行:

    [Column ( IsPrimaryKey = true, IsDbGenerated = true )] 
    public int ID { get; set; }

我不知道它是否对你有帮助,但也许这是一个很好的暗示...

答案 8 :(得分:-1)

是的,当然有可能。

快速解决方案:
首先检查它是否是重复的数字,然后再试一次,直到它不再是重复的数字。