| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- <?php
- namespace app\models\common;
- class InviteCode
- {
- // 给定字符序列
- // 可以更换其中的顺序和字母,但是不可以包含数字零('0')
- const CHARS = [
- '9', 'W', '6', 'X', 'D', 'E', '7', 'G', 'I', 'S', '2',
- 'J', 'P', '5', 'U', 'K', '3', 'M', 'Z', 'F', 'C', '4',
- 'B', 'N', 'H', 'L', 'Y', 'Q', 'V', 'A', 'T', 'R', '8'
- ];
- // 邀请码间隔码,因为有的邀请码是不足6位的,所以要有间隔码
- const DIVIDER = '0';
- // 最短设备码
- const CODE_MIN_LENGTH = 8;
- /*
- * ID转化为邀请码
- */
- public static function id2Code($id): string
- {
- $charsLen = count(self::CHARS);
- $buf = '';
- // 最大下标
- $posMax = $charsLen - 1;
- // 将10进制的id转化为33进制的邀请码
- while (intval(bcdiv($id, $charsLen)) > 0) {
- $ind = intval(bcmod($id, $charsLen)); //$id % $charsLen;
- $buf .= self::CHARS[$ind];
- $id = bcdiv($id, $charsLen);
- }
- $buf .= self::CHARS[intval($id)];
- // 反转buf字符串
- $buf = strrev($buf);
- // 补充长度
- $fixLen = self::CODE_MIN_LENGTH - mb_strlen($buf, 'UTF-8');
- if ($fixLen > 0) {
- $buf .= self::DIVIDER;
- for ($i = 0; $i < $fixLen - 1; $i++) {
- // 从字符序列中随机取出字符进行填充
- //$buf .= self::CHARS[rand(0, $posMax)];
- $buf .= self::CHARS[($i % $posMax)];
- }
- }
- return $buf;
- }
- /*
- * 邀请码转化为ID
- */
- public static function code2ID($code): string
- {
- $charsLen = count(self::CHARS);
- $codeLen = mb_strlen($code, 'UTF-8');
- $id = '0';
- // 33进制转10进制
- for ($i = 0; $i < $codeLen; $i++) {
- if ($code[$i] === self::DIVIDER) {
- break;
- }
- $ind = 0;
- for ($j = 0; $j < $charsLen; $j++) {
- if ($code[$i] === self::CHARS[$j]) {
- $ind = $j;
- break;
- }
- }
- if ($i > 0) {
- $id = bcadd($ind, bcmul($id, $charsLen));
- } else {
- $id = $ind;
- }
- }
- return (string)intval($id);
- }
- }
|