未使用的随机 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 编号的主要内容,如果未能解决你的问题,请参考以下文章