PHP 根据用户ID生成邀请码

Jackey PHP 5,995 次浏览 , 没有评论

PHP根据用户ID生成邀请码,并可根据邀请码回推用户的ID。

封装类:

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

 

使用方法:

  1. <?php
  2. require 'InviteCode.php';
  3. $id = 1; //2147483647
  4. $invite = new InviteCode();
  5. $code = $invite->id2Code($id);
  6. echo $code . '------';
  7. $id = $invite->code2ID($code);
  8. echo $id;

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go