InviteCode.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace app\models\common;
  3. class InviteCode
  4. {
  5. // 给定字符序列
  6. // 可以更换其中的顺序和字母,但是不可以包含数字零('0')
  7. const CHARS = [
  8. '9', 'W', '6', 'X', 'D', 'E', '7', 'G', 'I', 'S', '2',
  9. 'J', 'P', '5', 'U', 'K', '3', 'M', 'Z', 'F', 'C', '4',
  10. 'B', 'N', 'H', 'L', 'Y', 'Q', 'V', 'A', 'T', 'R', '8'
  11. ];
  12. // 邀请码间隔码,因为有的邀请码是不足6位的,所以要有间隔码
  13. const DIVIDER = '0';
  14. // 最短设备码
  15. const CODE_MIN_LENGTH = 8;
  16. /*
  17. * ID转化为邀请码
  18. */
  19. public static function id2Code($id): string
  20. {
  21. $charsLen = count(self::CHARS);
  22. $buf = '';
  23. // 最大下标
  24. $posMax = $charsLen - 1;
  25. // 将10进制的id转化为33进制的邀请码
  26. while (intval(bcdiv($id, $charsLen)) > 0) {
  27. $ind = intval(bcmod($id, $charsLen)); //$id % $charsLen;
  28. $buf .= self::CHARS[$ind];
  29. $id = bcdiv($id, $charsLen);
  30. }
  31. $buf .= self::CHARS[intval($id)];
  32. // 反转buf字符串
  33. $buf = strrev($buf);
  34. // 补充长度
  35. $fixLen = self::CODE_MIN_LENGTH - mb_strlen($buf, 'UTF-8');
  36. if ($fixLen > 0) {
  37. $buf .= self::DIVIDER;
  38. for ($i = 0; $i < $fixLen - 1; $i++) {
  39. // 从字符序列中随机取出字符进行填充
  40. //$buf .= self::CHARS[rand(0, $posMax)];
  41. $buf .= self::CHARS[($i % $posMax)];
  42. }
  43. }
  44. return $buf;
  45. }
  46. /*
  47. * 邀请码转化为ID
  48. */
  49. public static function code2ID($code): string
  50. {
  51. $charsLen = count(self::CHARS);
  52. $codeLen = mb_strlen($code, 'UTF-8');
  53. $id = '0';
  54. // 33进制转10进制
  55. for ($i = 0; $i < $codeLen; $i++) {
  56. if ($code[$i] === self::DIVIDER) {
  57. break;
  58. }
  59. $ind = 0;
  60. for ($j = 0; $j < $charsLen; $j++) {
  61. if ($code[$i] === self::CHARS[$j]) {
  62. $ind = $j;
  63. break;
  64. }
  65. }
  66. if ($i > 0) {
  67. $id = bcadd($ind, bcmul($id, $charsLen));
  68. } else {
  69. $id = $ind;
  70. }
  71. }
  72. return (string)intval($id);
  73. }
  74. }