网上查看了下别人怎么实现邀请码的,写个注释,方便理解。
不过,不知道会不会生成重复的code。好像是一般情况不会生成重复的code,高并发的情况可能会有重复的情况出现。如果怕生成重复的code,还是写入数据库或缓存保存起来,下次生成新的code再去比对一次,如果存在的话重新生成新的。
代码如下:
function generate_invite_code() {
$code = ''; //保存生成的code码
$char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //26个字符
$char2 = '0123456789ABCDEFGHIJKLMNOPQRSTUV'; //32个字符
$data[0] = $char[mt_rand(0,25)]; //值为A~Z
$data[1] = strtoupper(dechex(Date('m',time()))); //值为1~C
$data[2] = Date('d',time()); //值为1~31
$data[3] = substr(time(),-5); //时间戳后5位
$data[4] = substr(microtime(),2,5); //值为微秒的小数点后5位
$data[5] = sprintf('%02d',rand(0,99)); //值为0~99
$str = implode('', $data); //合并为字符串
$bin = md5( $str, true ); //16字节的二进制数据
for($i=0;$i<8;$i++){
$a8 = ord($bin[$i]); //$a8保存前8字节的循环数据
$b8 = ord($bin[$i+8]); //$b8保存后8字节的循环数据
$index = ($a8 ^ $b8) - $a8 & 0x1F; //0x1F表示31,即$index的范围为0~31
$code .= $char2[$index]; //根据下标取出$char2中字符串
}
return $code;
}
参考: