php生成唯一uid的解决思路「建议收藏」

php生成唯一uid的解决思路

大家好,又见面了,我是全栈君。

一、生成唯一uuid

  • 看到某些人会用uuid去代替用户的uid

  • 从代码中可以看出,通过unique生成一个以毫秒级时间戳为前缀的字符后md5加密

  • 再通过分隔符进行分割后得到uuid

  • 这种方式虽然极大程度的避免了uid的重复

  • 但是生成的uid太长,足足36个字符,而且是混杂英文和数字符号的,可读性很差

  • 而一般的uid中都是纯数值组成的

<?php
function generateUUid($strtoupper = false)
{
    $charid = call_user_func($strtoupper ? 'strtoupper' : 'strtolower', md5(uniqid(microtime(true), true)));
    $hyphen = chr(45);
    $uuid = substr($charid, 0, 8) . $hyphen . substr($charid, 8, 4) . $hyphen . substr($charid, 12, 4) . $hyphen . substr($charid, 16, 4) . $hyphen . substr($charid, 20, 12);
    return $uuid;
}


//结果:37f14a07-cb18-2e54-4e40-da1e2fa0456d

二、生成唯一uid

  • 由于一般正常的uid都是纯数值型的

  • 而要保证唯一性,必然要跟时间戳有关系,因此有了以下代码

  • 为了尽可能的在同一秒中注册人数的uid不同,将时间戳进行打乱随机排序,也不失为一个好办法

  • 但是这种缺点就是,uid长度是固定的,无法进行改变,虽然呢,打乱字符是一个很好的解决重复的方式

  • 但是事情无绝对,如果真的因为随机碰撞导致的uid相同该如何

  • 为了更保险起见,必然还是要走一次数据库的查询

  • 大大增加了数据库的I/O压力

<?php
function generateUid()
{
    return call_user_func('str_shuffle', time());
}


//结果:4067524162

三、 生成唯一uid的正确方法

  • 虽然说上面的两种方式并非不可取

  • 但是在大型公司必然不可取,一种是uid的格式必然纯数值,所以uuid方式可以排除

  • 另外由于对数据库的压力起见,必然也不会采用第二种方式

  • 而最经常采用的方式应该是使用数据库的主键索引,因为主键索引必然唯一

  • 这里很多人会疑惑,主键索引不是会从1开始吗,这uid会有1位数的?

  • 小了,格局小了,你可以设置主键索引的offset,让他从100000开始,不就可以解决这个问题了吗

  • 这时候有人又问,那主键索引增加不是有规律的吗,比如插一条,会自增1

  • 这时候就可以设置主键索引的增长步长,让他插入一条的步长不为1即可

  • 而为了让uid看起来更加没有关联性,你可以设置步长为基数,比如3

  • 这样增长起来,就会是100000,100003,100006,100009,100012….

php生成唯一uid的解决思路「建议收藏」

php生成唯一uid的解决思路「建议收藏」

系统推荐

php生成唯一uid的解决思路「建议收藏」

实践学习php,thinkphp,Redis,vue,uni-app等技术,推荐开源电商系统likeshop,可以借鉴思路,点击阅读原文,或打开地址: 

 https://gitee-github.com/VyN8svYL  

求一键四连:点赞转发在看阅读原文

php生成唯一uid的解决思路「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111524.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js正则表达式语法

    js正则表达式语法

    2021年12月31日
    41
  • 企业级发卡网源码下载带代理系统授权搭建教程

    企业级发卡网源码下载带代理系统授权搭建教程  发卡网源码,英文名:Automaticshippingsourcecode,适用于构建在互联网上用于虚拟商品自动发货和交易的网购平台。往往根据用途和规模不同,分为:企业发卡网源码和个人发卡网源码,其核心功能为自动发货和自动收付款,类似于线下的无人售货机。  发卡网只适用于虚拟物品的交易,无法完成实物的交易,由于实物涉及快递时长,不符合发卡网方便快捷的特点。要想搭建一个运转良好的发卡网是需要做大量工作的,但最重要最基础的是搭建的发卡网源码稳定且bug少,不然很难提供频繁的发卡交易服务。 

    2022年7月14日
    33
  • linux经常使用命令:打包、复制等[通俗易懂]

    linux经常使用命令:打包、复制等

    2022年1月30日
    42
  • 逆波兰法表示的表达式_波兰表达式和逆波兰

    逆波兰法表示的表达式_波兰表达式和逆波兰根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1:输入:tokens = [“2″,”1″,”+”,”3″,”*”]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输入:tokens = [“4″,”13″,”5″,”/”,”+”]输

    2022年8月9日
    8
  • HTML导航条的制作

    HTML导航条的制作导航条的制作HTML代码:<nav>  <ul>    <li>      <ahref=”#”></a>    </li>    <li>      <ahref=”#”></a>    </li>  </ul></na…

    2022年7月22日
    6
  • 引用数据类型分为哪三类_类都是引用数据类型吗

    引用数据类型分为哪三类_类都是引用数据类型吗Java引用数据类型(String)引用数据类型概述引用数据类型与基本数据类型的差别(举例说明)引用数据类型概述说到引用数据类型,那么何为引用数据类型?引用类型,都可以用null值作为值,也就是说可以在初始化的时候赋值为null,String是引用类型,也就是说可以使用null作为值。引用数据类型与基本数据类型的差别(举例说明)使用基本数据类型:inti1=1inti2=1这种是会在内存中存储两个1的值但是,使用引用类型就不会!Strings=“hello”Str

    2022年10月21日
    0

发表回复

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

关注全栈程序员社区公众号