未使用的随机 dosieid 编号

Posted

技术标签:

【中文标题】未使用的随机 dosieid 编号【英文标题】:Random dosieid number that is not used 【发布时间】:2011-12-20 16:43:44 【问题描述】:

我正在尝试为我的网站生成一个唯一的“dosieid”编号。我的网站是一个人力资源计划解决方案,在该计划中,用户在他们的公司中创建他们工人的 dosie ...随机 dosieid 需要我,所以当用户在字段 dosieid 中创建 dosie 时,会自动显示以前未使用的 dosieid-s.. .数据库中不存在的dosieid。在其他情况下,我会使用自动增量,但在这种情况下,dosie 尚未创建。如果用户对随机数不满意,则必须以 dosieid 形式选择更改数字。还有一个提示数字必须是从 1 到 9999。有人可以帮我吗?我尝试了很多代码,但我没有找到与此规范类似的代码。

这是我到目前为止所做的。它得到了随机数,但我不知道如何将该随机数与数据库行“dosieid”进行比较?

$id_num = mt_rand(1,9999);

$query = "SELECT dosjeid FROM albums";

$result = mysql_query($query) or die(mysql_error());

while($account = mysql_fetch_array($result))

    if ($id_num == $account['id']) 

        $id_num = mt_rand(1,9999);  

    

   
echo"$id_num<br>";

【问题讨论】:

【参考方案1】:

这非常令人费解……为什么自动递增的数字还不够?此代码也永远无法正常工作。如果出于某种原因您必须使用随机数,那么您可以这样做:

while(true) 
    $id_rand = mt_rand(1,9999);
    $result = mysql_query("SELECT count(*) FROM albums WHERE dosjeid=$id_rand") or die(mysql_error());
    $row = mysql_fetch_row($result);
    if ($row[0] == 0)  
       break; // our random number isn't in the database, so exit the loop
    

但是,这里有一些问题:

1) 当您达到 9999 个剂量记录时,您将获得一个无限循环 2)数据库中的记录越多,这个循环找到“空”槽所需的时间就越长。随着您越来越接近 9999 条记录,您将需要很长时间才能找到一个空槽 3) 如果您试图“隐藏”任何成员的 ID,以便用户不能简单地在某处增加 ID 参数以查看其他人的记录,那么有 FAR FAR FAR 更好/更简单的方法来做到这一点,例如加密发送给客户之前的 ID 值。

【讨论】:

@Marc B 好的,我明白了,但是我怎样才能对其进行编码以获取第一个未使用的数字,即数据库中尚未使用的数字?喜欢从 a-z? 然后,只需使用自动增量并保持不变。【参考方案2】:

使用自动递增的数字作为主键,并使用具有 UNIQUE 属性的附加显示 ID 作为向用户显示的 ID。这样,您就有了一个用于内部处理的唯一 ID 和一个可以轻松更改的显示 ID。

【讨论】:

我的主键是dosieid @Reddwarf:我告诉你的是你应该把它们分开。 它们是分开的。 Userid 是自动递增的,因为它 selfe 用户 id 是每个用户唯一的 id,我有每个 dosie 唯一的 dosieid。也许我不明白?【参考方案3】:

这是一个糟糕的设计。您应该:

    不允许用户创建 dosieid(自己创建,创建记录后给他们) 尝试先使用分配的 dosieid 创建存根记录,然后使用信息更新它 或使用 UUID,这需要比 1-9999 大得多的范围

即使您检查该号码是唯一的,在您检查它的时间和您插入其他人可能已经使用它的记录之间。

在任何情况下,您都不应该通过随机选择数字来找到空的 id。这使您的程序执行时间不确定,如果您最终获得 5000 名员工,您可能会等待很长时间

另外,这个范围对于随机性要求来说太小了。

【讨论】:

首先,dosie id 只是一个 id,数据库 userid dosieid 中有 3 个 id-s,还有一个,所以用户只能在他的 userid 上输入不是 == 的数字来 dosieid ...好的,我理解等待,那是我无法承受的事情......我可以做一些不使用随机数的事情然后 rader a-z 吗?以及如何【参考方案4】:

您可能还想了解仅数字哈希(检查算法的冲突率)-php: number only hash?

function doesIdExists($id)

   $query = "SELECT dosjeid FROM albums";
   $result = mysql_query($query) or die(mysql_error());
   while($account = mysql_fetch_array($result)) 
   
      if ($id_num == $account['id'])
           return true;  /* The id is taken */
   
   return false; /* Not taken */


$recNotAdded = true;

while($recNotAdded)

    $rand = mt_rand(1,1000);  //Whatever your numbers
    $doesExist = doesIdExists($rand);
    if(!$doesExist)
    
       /* Add to DB */
       $recNotAdded = false;
    
 

【讨论】:

您的查询应该使用 WHERE 子句让数据库过滤结果。客户端过滤绝不是一个好主意,而且效率极低。 @MarcB 那是我没有篡改的 OP 部分。

以上是关于未使用的随机 dosieid 编号的主要内容,如果未能解决你的问题,请参考以下文章

Chapter 5 数组:为什么很多编程语言种数组都是从0开始编号?

Redis Lua Java 随机编号 用户编号

Redis集群 Lua Java 随机编号 用户编号

收据编号未在贝宝沙盒响应中返回

如何使用JS随机更改HTML内容

从数组中随机选择项目,仅在之前未使用过的情况下使用[重复]