Heim >Backend-Entwicklung >PHP-Tutorial >怎样生成数据库中不重复的固定位数的数字?

怎样生成数据库中不重复的固定位数的数字?

WBOY
WBOYOriginal
2016-06-06 20:44:021489Durchsuche

随机生成固定的位数(比如8位)的数字,

作为用户注册的uid存入数据库,

每个uid不重复,

但可以是12345678,12345677。

有种方法是随机生成8位数字,

然后查询数据库有无此数据,

有则重新生成在查询,

无则写入数据库,

这样的方式比较费时。

有没有更好的方法,

比如结合别的随机值、时间戳之类的。

求解题思路或者方法,可用php实现

回复内容:

随机生成固定的位数(比如8位)的数字,

作为用户注册的uid存入数据库,

每个uid不重复,

但可以是12345678,12345677。

有种方法是随机生成8位数字,

然后查询数据库有无此数据,

有则重新生成在查询,

无则写入数据库,

这样的方式比较费时。

有没有更好的方法,

比如结合别的随机值、时间戳之类的。

求解题思路或者方法,可用php实现

通常数据库中存储的就是时间戳,也就是当前系统时间的毫秒数,然后除以1000,获取当前时间的秒数做为uid即可,因为如要存储的是毫秒的话,它占用数据库太长,用秒数即可保证唯一不重复。如果想让生成uid不只是数字还要有字母的话,可以将秒数转成16进制即可。

用户注册的uid,在某个范围自增就可以吧。
假设用户注册的qps没有那么高,可以利用update+私有复杂数据的方法在mongodb模拟一个锁,锁保护“上次注册的用户的uid”数据,每次拿锁,加一,注册,将锁保护的uid+1,释放锁即可。

唯一,非顺序:md5(uniqid());
顺序唯一:自增

使用时间戳,重复的几率几乎没有。

<code>//生成0到1的随机小数
public  function randomFloat($min = 0, $max = 1) {
    return $min + mt_rand() / mt_getrandmax() * ($max - $min);
}
</code>

为什么怎么搞?不用主键自增?

uid最好还是用主键自增吧,然后php这边用mysql_insert_id()之类的函数取。这样查询操作也比较少。

创建一个自增列,起始值从10000000开始就行了。

很高兴为LZ解答这个问题。

首先,有什么东西是不停递增,并且不会重复的?

时间。

正如LZ猜想的那样,使用时间截转化成数字,可以产生始终递增并且不会重复的数字。

并且,这些数字还可以根据时间的推移,看大小就知道注册先后和注册时间。

这里仅仅是抛砖引玉。

<code class="lang-php">$now=date("Y-m-d H:i:s");//按照 年月日,时分秒的格式,记录当前时间。
$unix_stamp=strtotime($now);
echo $unix_stamp;
/*strtotime函数预期一个包含美国英语日期格式的字符串,并尝试将其
解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数)
这里LZ大概会得到一个10位的数字。*/
</code>

LZ可以把$unix_stamp作为随机uid,如果认为秒数产生的数值不够随机的话

(比如1秒内有多人同时注册),可以在$unix_stamp后加上microtime()函数转换成数字

来使得这个数字更加随机,以避免uid重复的问题。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn