生成不可重复取餐码的方法?

thinkwei
  • 458
用户取餐时,要用取餐码领取,生成订单是需要生成不可重复取餐码。

取餐码格式为:   

clipboard.png

生成应该格式比较容易生成,多个用户生成的时候可能会重复。
回复
阅读 5.4k
8 个回答
周小e丶
  • 869

可以把userid或者其他唯一性数据加密加到前面~

$perfix = 1;//使用USER_ID做前缀

//去当前毫秒时间戳
$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));//转成36进制
小哈
  • 214

看了下楼上的答案,都很棒,很正确,但是我们好像被作者的问题限制住了思维,因为我发现他的核心需求是生成取餐码,并非生成为随机字符串。。
一:不需要保密的方案
1.按照序号不行吗??
2.用户用这个这么长的编码不好记,而且如果不是扫描的话,服务员输入的时候也不好输入啊。。。
3.如果用序号有好处就是方便统计。店长看了下最后一单的序号是100,那肯定今天又100个人点餐了,不用在单独开发功能。

具体方法,不多说了就举个现实的例子。
肯定看过电影,电影票的取票码咋弄的??年份加月加日再加一个序号。。。既能提醒是哪一天,还能向使用者传递出我这个电影今天的销量如何。

二:要保密
同样的道理。。。年+随机串+随机串+日+随机串+每天的序号+随机串


最后补充一点就是用序号的话就是有一点要注意,后台的服务一定不能是异步的修改数据库。


如果觉得回答是认真的,请采纳

陈二先生
  • 562

理论上,哈希是很难相遇的,那么可以参考这样 $code = md5(time());抱歉,现在补上,因为是限制十二位数的,所以不妨改动一下


$code = '';
$length = 12;
$str = md5(time()).md5($userid);
for($i = 0;$i < $length;$i++ ){
    $index = rand(0,strlen($str));
    $code .= $str[$index];
}
echo $code;

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

首先要确认下,取餐的用户是否有独立标识?比如桌号什么的,如果有,那么就可以使用桌号作为唯一标识,辅以当前时间戳等进行加密了

Yii自带方法

echo Yii::$app->getSecurity()->generateRandomString(6);
hupeng
  • 14

可以参考生成唯一用户随机uid的方案
1.先生成大量取餐码到数据库 并生成取餐码队列
2.数据库对取餐码做唯一索引
3.定时检查取餐码队列长度,长度不够时及时新增队列
4.用户取餐时,从队列中pop一个取餐码即可

宣传栏