鍍金池/ 問答/PHP/ 生成不可重復(fù)取餐碼的方法?

生成不可重復(fù)取餐碼的方法?

用戶取餐時(shí),要用取餐碼領(lǐng)取,生成訂單是需要生成不可重復(fù)取餐碼。

取餐碼格式為:   

clipboard.png

生成應(yīng)該格式比較容易生成,多個(gè)用戶生成的時(shí)候可能會(huì)重復(fù)。
回答
編輯回答
執(zhí)念

Yii自帶方法

echo Yii::$app->getSecurity()->generateRandomString(6);
2017年11月1日 14:43
編輯回答
陌南塵

一般md5(time().$userid)或者md5(time().mt_rand(10000,99999))就可以了

2017年9月14日 07:49
編輯回答
陪妳哭

可以參考生成唯一用戶隨機(jī)uid的方案
1.先生成大量取餐碼到數(shù)據(jù)庫 并生成取餐碼隊(duì)列
2.數(shù)據(jù)庫對(duì)取餐碼做唯一索引
3.定時(shí)檢查取餐碼隊(duì)列長度,長度不夠時(shí)及時(shí)新增隊(duì)列
4.用戶取餐時(shí),從隊(duì)列中pop一個(gè)取餐碼即可

2017年2月2日 00:46
編輯回答
久不遇

可以把userid或者其他唯一性數(shù)據(jù)加密加到前面~

2017年12月1日 16:25
編輯回答
薔薇花

理論上,哈希是很難相遇的,那么可以參考這樣 $code = md5(time());抱歉,現(xiàn)在補(bǔ)上,因?yàn)槭窍拗剖粩?shù)的,所以不妨改動(dòng)一下


$code = '';
$length = 12;
$str = md5(time()).md5($userid);
for($i = 0;$i < $length;$i++ ){
    $index = rand(0,strlen($str));
    $code .= $str[$index];
}
echo $code;
2017年11月14日 03:07
編輯回答
任她鬧

看了下樓上的答案,都很棒,很正確,但是我們好像被作者的問題限制住了思維,因?yàn)槲野l(fā)現(xiàn)他的核心需求是生成取餐碼,并非生成為隨機(jī)字符串。。
一:不需要保密的方案
1.按照序號(hào)不行嗎??
2.用戶用這個(gè)這么長的編碼不好記,而且如果不是掃描的話,服務(wù)員輸入的時(shí)候也不好輸入啊。。。
3.如果用序號(hào)有好處就是方便統(tǒng)計(jì)。店長看了下最后一單的序號(hào)是100,那肯定今天又100個(gè)人點(diǎn)餐了,不用在單獨(dú)開發(fā)功能。

具體方法,不多說了就舉個(gè)現(xiàn)實(shí)的例子。
肯定看過電影,電影票的取票碼咋弄的??年份加月加日再加一個(gè)序號(hào)。。。既能提醒是哪一天,還能向使用者傳遞出我這個(gè)電影今天的銷量如何。

二:要保密
同樣的道理。。。年+隨機(jī)串+隨機(jī)串+日+隨機(jī)串+每天的序號(hào)+隨機(jī)串


最后補(bǔ)充一點(diǎn)就是用序號(hào)的話就是有一點(diǎn)要注意,后臺(tái)的服務(wù)一定不能是異步的修改數(shù)據(jù)庫。


如果覺得回答是認(rèn)真的,請(qǐng)采納

2017年11月13日 03:56
編輯回答
故人嘆

首先要確認(rèn)下,取餐的用戶是否有獨(dú)立標(biāo)識(shí)?比如桌號(hào)什么的,如果有,那么就可以使用桌號(hào)作為唯一標(biāo)識(shí),輔以當(dāng)前時(shí)間戳等進(jìn)行加密了

2018年8月18日 17:14
編輯回答
慢半拍
$perfix = 1;//使用USER_ID做前綴

//去當(dāng)前毫秒時(shí)間戳
$time = explode(" ", microtime());
$time = $time[1] . ($time[0] * 1000);
$time2 = explode(".", $time);
$time = $time2[0];

$number = $time + mt_rand(0, 99);
echo $perfix.strtoupper(base_convert($number,10,36));//轉(zhuǎn)成36進(jìn)制
2017年10月25日 01:27