Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 自定义唯一ID_Php_Yii - Fatal编程技术网

Php 自定义唯一ID

Php 自定义唯一ID,php,yii,Php,Yii,有没有办法让我的模型ID(主键)生成为随机唯一的8位数字,只包含数字,而不是默认的自动递增? 一位客户要求提供这种特定的8位数字功能,因此我无法对其原因进行太多争论 我想使用PHP uniqid,但它是13位数字,也包含字母 有什么想法吗 谢谢 更新 我忘了告诉你我需要随机生成的ID来保存每一条新记录 只需要询问生成ID然后保存ID(以及属性)的机制。我是否必须首先检查数据库中随机生成的ID是否已经存在另一个相同的键,然后保存属性或什么?保留ID,但将其填充 $id = 6; $padded_i

有没有办法让我的模型ID(主键)生成为随机唯一的8位数字,只包含数字,而不是默认的自动递增? 一位客户要求提供这种特定的8位数字功能,因此我无法对其原因进行太多争论

我想使用PHP uniqid,但它是13位数字,也包含字母

有什么想法吗

谢谢

更新

我忘了告诉你我需要随机生成的ID来保存每一条新记录


只需要询问生成ID然后保存ID(以及属性)的机制。我是否必须首先检查数据库中随机生成的ID是否已经存在另一个相同的键,然后保存属性或什么?

保留
ID,但将其填充

$id = 6;
$padded_id = sprintf("%013d", $id);
// This will print 0000000000006
这将填充
$id
,使其长度为13位

每次需要显示
ID
时,请使用函数对其进行转换,如下所示

function padId($id){
    return sprintf("%013d", $id);
}

或者,您可以在表中创建一行名为
pad id
,然后在创建记录时运行此函数(以及
mysql\u insert\u id
(以获取刚刚插入的
id

是的,你可以。当谈到人工智能时,我假设您使用的是MySQL。只是不要将其设置为自动递增,而是像插入其他列一样插入值。您可以创建一个函数或方法,该函数或方法将随机或按特定顺序(算法)使用最多8个数字

在模型(id、名称、值等)中插入值(87654321、“我选择的名称”、“某些价格或文本”、“等”)

考虑INT(11)值可以接受从-2147483648到2147483647的范围。适用于8位数字。如果以后客户端请求更大的数字,您可能需要切换到BIGINT

我使用将主键设置为unsigned,这允许您拟合0和4294967295之间的数字

对于8位数字的php函数生成器:

<?php

mt_srand();
$id = mt_rand(10000000, 99999999);

?>


您可以在php文档中阅读有关mt_srand()和mt_rand()的更多信息。据说它们比srand()和rand()更好。

为什么不保留自动增量,但将其设置为从主键的10000000开始,而不是从1开始


ALTER TABLE some\u TABLE AUTO\u INCREMENT=10000000

最佳方法取决于客户随机性要求的一个微妙方面-- 当他们说随机是指完全不可预测还是很难预测?我无意让你听起来像莱温斯基审判时的克林顿,但你的当事人说“随机”会影响你是否有可能达到要求

如果客户机想要隐藏用户ID(为了某种感知的安全利益),并使其几乎不可能预测或反向工程,那么这是非常困难的。如果客户对“难以”预测(我怀疑)感到满意,那么您可以做一些简单的事情,类似于md5方法(@Dotty)。但md5并非如此。即使使用最好的、可证明唯一的散列算法(md5不是),如果用户数量与用户ID允许的位数(8)相比太多,您也会遇到冲突问题。在允许的8位小数中,大约有27位可以使用。这意味着您可能会在2^N/2=2^(27/2)之后发生冲突,这大约是10K用户。因此,如果客户机的用户列表接近10000个用户,那么即使是最好的哈希算法也会花费大量时间过滤掉所有冲突。 要在不使用过滤器和非确定性算法的情况下解决此问题,只需使用简单的“”算法。有些会产生伪随机数(PRN),这些伪随机数保证是唯一的,并且保证完全覆盖您试图覆盖的任何范围(例如,所有8位正整数的集合)。如果您需要对用户注册序列进行反向工程,只需使用您使用的任何初始值重新运行全周期PRN生成器。如果你的客户想让黑客对你的用户ID序列进行反向工程变得稍微困难一些,而不是简单一些,那么你可以将这个初始值保密,就像私钥一样

客户的另一个问题是,用户id中是否允许前导零。如果允许,那么(客户的随机性要求是自由的),Wikipedia上的简单算法将非常适合您。它可以被提炼成2行PHP。
无论使用何种算法,最好在单独的表中实际生成官方8位半随机用户ID列表,然后在添加新用户时从表顶部“弹出”值(删除该行)。数据库内存需求不应该太高,它将简化用户体验,消除由复杂、不确定、随机数生成器和唯一性过滤器造成的任何延迟和内存占用。试图在线、实时地创建用户ID,你可能会陷入一个永久的循环,一些散列算法会无限期地拖延你的用户注册。这个暂停(由于永久碰撞)可能要到用户1000或10000时才会发生。相比之下,使用离线查找表方法,您可以轻松添加额外的客户端指定的过滤器,如消除带前导零的ID;以防客户端不希望看到ID为1(00000001)的用户。你可以提前知道是否一切都会正常工作,没有任何挂起。

ID必须是随机的,还是只有8位数?ID必须是随机的。你说的8位数,我的示例打印13!在最初的问题中,我的意思是:)这个答案已经一塌糊涂了。我想关键是填上身份证!或者使用
md5()
substr
将其减少到8位。让它随机生成一个ID是一个坏主意,我们可能有多行具有相同的ID,这将导致巨大的问题。这就是为什么我建议填充实际ID,使其长度为13位。@dotty:这就是为什么要使用数据库
UNIQUE