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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 工厂+策略解决多重if-else

    工厂+策略解决多重if-else

    2021年7月11日
    95
  • SwipeRefreshLayout与RecyclerView的巧夺天工

    SwipeRefreshLayout与RecyclerView的巧夺天工平常开发我们需要使用ListView下拉刷新或者其下拉加载的时候,不是自己写就是用别人写好了,但是编程中有一点是不变的,就是一般封装好的东西,其扩展性极低,比如你使用xutils,imageloader等开源框架的时候,它允许你扩展吗?答案当然是否,那我想要实现自己非常酷酷的ListView时候,只有自己动手实现。不过,谷歌在2015在v4开发包加入豪华套餐SwipeRefreshLayout供

    2022年6月25日
    37
  • 《生物化学与分子生物学》—-绪论—-听课笔记(一)

    《生物化学与分子生物学》—-绪论—-听课笔记(一)[华中科技大学]生物化学与分子生物学绪论1.1生物化学与分子生物学绪论(1)生物化学(Biochemistry、Biologicalchemistry):研究生物体(微生物、植物、动物及人体)的化学组成和生命过程中的化学变化规律的科学。 分子生物学(MolecularBiology):生物化学有机地融合了微生物学、遗传学和细胞生物学的有关知识—-形成了现代的分子生物学。它…

    2022年7月11日
    13
  • 2010年最有价值做的16个广告联盟是_cpa广告联盟怎么做

    2010年最有价值做的16个广告联盟是_cpa广告联盟怎么做2010年最有价值做的16个广告联盟本篇文章来源于优乐智慧传媒-网络创富门户|www.youle668.cn原文链接:http://www.youle668.cn/article/20100326/71.html2010年谷歌退出中国内地,许多站长朋友一下子束手无策了,因为大多数人之前都是依靠adsense生存的,现在一下子说要走了,还真不知道怎样才好,其实也没必要太担心,所谓条条大路通…

    2025年12月3日
    3
  • Java e.printStackTrace()异常信息怎么打印到log日志中

    Java e.printStackTrace()异常信息怎么打印到log日志中Java e.printStackTrace()异常信息怎么打印到log日志中

    2022年4月24日
    50
  • idea2021.4.14激活码_通用破解码

    idea2021.4.14激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    68

发表回复

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

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