当前位置:首页 > PHP教程 > php应用 > 列表

php根据id生成10位不重复数字跟字母混合字符串

发布:smiling 来源: PHP粉丝网  添加日期:2023-09-16 16:06:07 浏览: 评论:0 

这篇文章主要介绍了php根据id生成10位不重复数字跟字母混合字符串方法,需要的朋友可以参考下。

php根据id生成10位不重复数字跟字母混合字符串最终生成效果

  1. S9q6Cdw9wB 
  2. e5D9uS6Lw2 
  3. w9G3KIJkwa 
  4. Q0F8d6LSwb 
  5. M7q3OvSDwC 
  6. C8g4MLZ2wD 
  7. S8L8d4xGwc 
  8. s8f19VIowE 
  9. Q5L2SV3bwF 
  10. H9W42ctdwG 

php代码:

  1. <?php 
  2. namespace  App\Services; 
  3. // 邀请码服务 
  4. class  InviteCodeService 
  5.  protected  $key,$num,$wordKey,$numericKey
  6.  public  function  __construct() 
  7.     { 
  8.  $this->key = 'X1A3B2abCDcEFGdH4eI5JfK6LgNM7OhP8QiR9SjTkUlVmWnSoYpZqrstuvwxyz'
  9.  $this->wordKey = 'AaBbCDcdeEfFgGihHIjJlKknmLqoNrwMpsvsOuPytQRzSTUVWSYZ'
  10.  $this->numericKey = '1234567890'
  11.  // 注意这个key里面不能出现数字0  否则当 求模=0 会重复的 
  12.  // 多少进制 
  13.  $this->num = strlen($this->key); 
  14.     } 
  15.  // 传递用户id生成唯一邀请码 
  16.  public  function  enCode(int  $user_id$length = 10) 
  17.     { 
  18.  $code = $end = $begin = $middle = ''// 邀请码 
  19.  //末尾用取模算法保证唯一 
  20.  while ($user_id > 0) { // 转进制 
  21.  $mod = $user_id % $this->num; // 求模 
  22.  $user_id = ($user_id - $mod) / $this->num; 
  23.  $end = $this->key[$mod] .  $end
  24.         } 
  25.  // 开头使用4位随机的数字加字母 
  26.  $begin = $this->wordKey[rand(0, strlen($this->wordKey) - 1)] .  $this->numericKey[rand(0, strlen($this->numericKey) - 1)] .  $this->wordKey[rand(0, strlen($this->wordKey) - 1)] .  $this->numericKey[rand(0, strlen($this->numericKey) - 1)]; 
  27.  // 中间用随机字符串补充 
  28.  while((strlen($begin)+strlen($middle)+strlen($end)) < $length){ 
  29.  $middle = $this->key[rand(0, $this->num - 1)] .  $middle
  30.         } 
  31.  $code = $begin.$middle.$end
  32.  return  $code
  33.     } 
  34.      /** 
  35.      * 邀请码获取用户id  一般都不需要用到 
  36.      * 这里的解密代码不完整,思路是对的 
  37.      * 解密思路 
  38.      * 加密的时候最后一位记录唯一串的长度,也就是 $end 的长度 
  39.      * 解密的时候读取串的最后一位获得长度,根据长度获取 $end 字符串 
  40.      * $end 通过以下函数就能实现解密 
  41.      * */ 
  42.     function deCode($code
  43.     { 
  44.         if (strrpos($code'0') !== false) 
  45.             $code = substr($codestrrpos($code'0') + 1); 
  46.         $len = strlen($code); 
  47.         $code = strrev($code); 
  48.         $user_id = 0; 
  49.         for ($i = 0; $i < $len$i++) 
  50.             $user_id += strpos($this->key, $code[$i]) * pow($this->num, $i); 
  51.         return $user_id
  52.     } 
  53. $a = 3600; 
  54. $b = $a + 10; 
  55. for($i=$a ; $i<$b;$i++){ 
  56.  echo (new  InviteCodeService)->enCode($i); echo PHP_EOL; 

20w 数据是没有重复的,并且邀请码解 用户id 也是正确的。

要注意的

$this->key 不能出现数字 0。

$this->key 不能有重复的字符串。 如: abccd c重复。

关于$this->key

$this->key 顺序可以打乱的,

// $this->key = 'abcdefghjkmnpqrstuvwxyz123456789'; // 没打乱的

$this->key = 'kh8sjpdazetnmb5yw7rq4gc9fuv3216x'; // 打乱的

$this->key 长度不限制, 但是最好别太短。

如 abcd: 最大的 用户id 是4的3次方 (256)

超过256会怎么样? 邀请码变成5位而已 ……. ,不好看。

为用户体验,$this->key 字符串别加 i o l 这些字母,因为容易混淆用户。

i : ll : 1o : 0 (当然0 是不能出现的)

很相似。

结尾

中间四位字符串确保有字符串+数字,尾数6位数确保随机性,6位数足够61^6次方,也就是 51520374361,这个数字比 int(11)表示的最大值 2147483648 还要大 49372890713。5位数就足够覆盖 int(11),剩余一位由开头补充

开头补充数字确保够10位

Tags: php生成不重复数字 php生成不重复字母混合

分享到: