❶ 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))
復制
但是,本質上,這兩種方式的隨機性是相等的。