php生成唯一uid的解决方法详解
2022-11-15 canyinms.com 【 字体:大 中 小 】
一、生成唯一uuid
二、生成唯一uid
三、生成唯一uid的正确方法
一、生成唯一uuid看到某些人会用uuid去代替用户的uid
从代码中可以看出,通过unique生成一个以毫秒级时间戳为前缀的字符后md5加密
再通过分隔符进行分割后得到uuid
这种方式虽然极大程度的避免了uid的重复
但是生成的uid太长,足足36个字符,而且是混杂英文和数字符号的,可读性很差
而一般的uid中都是纯数值组成的
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压力
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中生成标准uuid的方法
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
通常平台 会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。
由以 下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相 同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。
关于 UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。
在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx-xxxx-xxxx- xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。
而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
function guid(){ if (function_exists('com_create_guid')){ return com_create_guid(); }else{ mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45);// "-" $uuid = chr(123)// "{" .substr($charid, 0, 8).$hyphen .substr($charid, 8, 4).$hyphen .substr($charid,12, 4).$hyphen .substr($charid,16, 4).$hyphen .substr($charid,20,12) .chr(125);// "}" return $uuid; } } echo guid(); ?>
到此这篇关于php生成唯一uid的解决方法详解的文章就介绍到这了。
猜你喜欢
2023年高考需注意这些事项 注意事项有哪些?
2023年高考时间是几月几日 全国高考什么时候?
高考倒计时1天 几号开始高考?
晋江8个考点实行交通管制 此举有何意义?
高考生哪六样东西千万别发朋友圈?
黑龙江高考2023时间安排表 黑龙江高考是全国几卷?
《教育资源免费送!开学季大放送》
小学教育,如何激发孩子学习兴趣?
了解最新职业培训趋势,掌握未来就业机会!
教如何填报高考志愿
橘子洲旅游攻略 长沙橘子洲怎么玩
西安周边旅游攻略 西安周边最值得去的地方
毛坦厂中学万人雨中送考 毛坦厂送考头车车牌91666祝福考生
珠峰被救女子不愿支付全部救援费用 珠峰攀登者为救遇险女子放弃登顶
登珠峰获救女子只愿承担4成救援费是怎么回事 登珠峰获救女子只愿承担4成救援费具体情况
国内出现偏肺病毒感染 尚无治疗药物
男子连吃100天麦当劳减重53斤是真的吗 男子连吃100天麦当劳为什么能减重53斤
本周狗屎运最旺的星座 本周狗屎运最旺的四大星座
印度耗资百亿卢比的大桥又塌了是什么情况 印度耗资百亿卢比的大桥又塌了是为什么
一个村考出300多大学生6个北大 湖南一小村考上一本奖4000二本3000