❶ php生成10位左右,数字、字母混合的字符串且唯一
$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
$orderSn =
$yCode[intval(date('Y')) - 2017] . strtoupper(dechex(date('m'))) . date(
'd') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf(
'%02d', rand(0, 99));
❷ php解决高并发
<?php
2 //优化方案1:将库存字段number字段设为unsigned,当库存为0时,因为字段不能为负数,将会返回false
3 include('./mysql.php');
4 $username = 'wang'.rand(0,1000);
5 //生成唯一订单
6 function build_order_no(){
7 return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
8 }
9 //记录日志
10 function insertLog($event,$type=0,$username){
11 global $conn;
12 $sql="insert into ih_log(event,type,usernma)
13 values('$event','$type','$username')";
14 return mysqli_query($conn,$sql);
15 }
16 function insertOrder($order_sn,$user_id,$goods_id,$sku_id,$price,$username,$number)
17 {
18 global $conn;
19 $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price,username,number)
20 values('$order_sn','$user_id','$goods_id','$sku_id','$price','$username','$number')";
21 return mysqli_query($conn,$sql);
22 }
23 //模拟下单操作
24 //库存是否大于0
25 $sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' ";
26 $rs=mysqli_query($conn,$sql);
27 $row = $rs->fetch_assoc();
28 if($row['number']>0){//高并发下会导致超卖
29 if($row['number']<$number){
30 return insertLog('库存不够',3,$username);
31 }
32 $order_sn=build_order_no();
33 //库存减少
34 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id' and number>0";
35 $store_rs=mysqli_query($conn,$sql);
36 if($store_rs){
37 //生成订单
38 insertOrder($order_sn,$user_id,$goods_id,$sku_id,$price,$username,$number);
39 insertLog('库存减少成功',1,$username);
40 }else{
41 insertLog('库存减少失败',2,$username);
42 }
43 }else{
44 insertLog('库存不够',3,$username);
45 }
46 ?>
❸ thinkphp怎么生成唯一标识
1、md5(time() . mt_rand(1,1000000));
这种方法有一定的概率会出现重复
2、php内置函数uniqid()
uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.
w3school参考手册有一句话:"由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数"。
3、官方uniqid()参考手册有用户提供的方法,结果类似:{E2DFFFB3-571E-6CFC-4B5C-9FEDAAF2EFD7}
public function create_guid($namespace = '') {
static $guid = '';
$uid = uniqid("", true);
$data = $namespace;
$data .= $_SERVER['REQUEST_TIME'];
$data .= $_SERVER['HTTP_USER_AGENT'];
$data .= $_SERVER['LOCAL_ADDR'];
$data .= $_SERVER['LOCAL_PORT'];
$data .= $_SERVER['REMOTE_ADDR'];
$data .= $_SERVER['REMOTE_PORT'];
$hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
$guid = '{' .
substr($hash, 0, 8) .
'-' .
substr($hash, 8, 4) .
'-' .
substr($hash, 12, 4) .
'-' .
substr($hash, 16, 4) .
'-' .
substr($hash, 20, 12) .
'}';
return $guid;
}
❹ php 随机生成不重复用户ID
php可以使用uniqid函数生成唯一的ID
uniqid — 生成一个唯一ID
stringuniqid([string$prefix=""[,bool$more_entropy=false]])
获取一个带前缀、基于当前时间微秒数的唯一ID。
参数说明:
prefix:有用的参数。例如:如果在多台主机上可能在同一微秒生成唯一ID。
prefix为空,则返回的字符串长度为13。more_entropy 为 TRUE,则返回的字符串长度为23。
more_entropy:如果设置为 TRUE,uniqid() 会在返回的字符串结尾增加额外的煽(使用combined linear congruential generator)。使得唯一ID更具唯一性。
返回值:
返回字符串形式的唯一ID。
❺ PHP 中iVBOR是什么函数生成的
在PHP编程中,我们有时候在高并发的时候生成很多个不同的ID,用于标识一些东西。虽然有很多方法,可以实现这一过程,不过PHP还是给我们提供了一个很好的函数,用于生成不同的唯一的ID
PHP中的uniqid()函数
函数定义
uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。
语法
uniqid(prefix,more_entropy)
注释:
prefix可选。为 ID 规定前缀。如果两个脚本恰好在相同的微秒生成 ID,该参数很有用。
more_entropy 可选。规定位于返回值末尾的更多的熵。
举例说明
利用uniqid()生成一个ID
<?php//XXXXX
echo '输出一个唯一的ID标示符:'.uniqid();?>
echo '输出一个唯一的CHAODIQUAN.COM 标示符:'.uniqid();?>
利用for循环与uniqid()函数,连续生成10个不同的ID标识
代码
<?php//XXXXXXfor($i=1;$i<11;$i++){
echo '输出第'.$i.'个标示符:'.uniqid().'<br/>';}?>
对于uniqid()函数补充
如果我们单纯使用 uniqid()
这个方法,不带任何参数的话,这个方法只能保证单个进程,在同一个毫秒内是唯一的。如果使用uniqid("", true)。
带了一个墒值,自身已经有一个随机的方式能保证生成的id的随机性了。但是由于线性同余是比较简单的生成随机数的算法,随机性有可能还不够,所以,网上流传的一种更随机数值的方式是:
uniqid(mt_rand(), true)
其中
mt_rand() 生成随机数就不是使用线性同余生成随机数的方式了,而是使用 Mersenne Twister Random Number
Generator (梅森旋转算法)。换句话说,上面这个 id 由两种随机算法 +
时间戳生成。基本上,这个算法在很大程度上能保证唯一性了(如果要问冲突率的话,估计只有数学系学生能研究出来了...)。
上面的这个给出的id会有一个点号,而且长度并不是128bit。如果希望生成uuid,就需要一个hash,不管是md5,sha1 都是可以选择的。所以网上又有一种生成唯一码的方式。
md5(uniqid(mt_rand(), true))
复制
但是,本质上,这两种方式的随机性是相等的。