广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php生成唯一uid的解决方法详解
  • 582
分享到

php生成唯一uid的解决方法详解

php生成uidphp生成唯一uid 2017-04-17 03:04:34 582人浏览 无得
摘要

目录一、生成唯一uuid二、生成唯一uid三、生成唯一uid的正确方法补充一、生成唯一uuid 看到某些人会用uuid去代替用户的uid 从代码中可以看出,通过unique生成一个以毫秒级时间戳为前缀的字符后md5加密 再通过分隔符进行分割

目录
  • 一、生成唯一uuid
  • 二、生成唯一uid
  • 三、生成唯一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中生成标准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)


<?php

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的解决方法详解的文章就介绍到这了,更多相关php内容请搜索编程界以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程界!

--结束END--

本文标题: php生成唯一uid的解决方法详解

本文链接: https://www.lsjlt.com/news/47.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php生成唯一uid的解决方法详解
    目录一、生成唯一uuid二、生成唯一uid三、生成唯一uid的正确方法补充一、生成唯一uuid 看到某些人会用uuid去代替用户的uid 从代码中可以看出,通过unique生成一个以毫秒级时间戳为前缀的字符后md5加密 再通过分隔符进行分割...
    99+
    2017-04-17
    php生成uid php生成唯一uid
  • 详解如何利用Redis实现生成唯一ID
    目录一、摘要二、方案实践2.1、引入 Redis 组件2.2、添加 redis 环境配置2.3、编写服务验证逻辑,通过 aop 代理方式实现2.4、在相关的业务接口上,增加SubmitLimit注解即可三、小结一、摘要 ...
    99+
    2022-11-19
    Redis生成唯一ID Redis 唯一ID
  • 详解MySQL主键唯一键重复插入解决方法
    目录解决方案:1. IGNORE2. REPLACE3. ON DUPLICATE KEY UPDATE我们插入数据的时候,有可能碰到重复数据插入的问题,但是这些数据又是不被...
    99+
    2022-11-12
  • Python标准库uuid模块(生成唯一标识)详解
    目录UUID格式组成Python 中的uuid 模块uuid1() 中的getnode()UUID实际应用UUID 的劣势参考资料:总结UUID (Universally Uniqu...
    99+
    2022-11-11
  • php生成csv乱码的解决方法
    这篇文章主要介绍了php生成csv乱码的解决方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php生成csv乱码是因为输出的csv格式文件没有BOM,其解决办法就是使用BO...
    99+
    2023-06-15
  • js动态生成唯一id的三种方法
    目录一. 引入时间戳,生成可控长度的随机数二. JS 生成随机三、ID生成器NanoID下面是一些补充一. 引入时间戳,生成可控长度的随机数 随机数长度控制,定义一个长度变量(len...
    99+
    2023-05-18
    js动态生成唯一id js唯一id
  • Redis生成全局唯一ID的实现方法
    目录简介:特性:生成规则: ID生成类:测试类:简介: 全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具 特性: 唯一性高性能安全性高可用递增性 生成规则:...
    99+
    2022-11-13
  • 使用redis生成唯一编号及原理示例详解
    在系统开发中,保证数据的唯一性是至关重要的一件事,目前开发中常用的方式有使用数据库的自增序列、UUID生成唯一编号、时间戳或者时间戳+随机数等。 在某些特定业务场景中,可能会要求我们...
    99+
    2022-11-12
  • Python用UUID库生成唯一ID的方法示例
    UUID介绍 UUID是128位的全局唯一标识符,通常由32字节的字符串表示。它可以保证时间和空间的唯一性,也称为GUID,全称为:UUID —— Universally Unique IDentifie...
    99+
    2022-06-04
    示例 方法 Python
  • php生成文件名乱码的解决方法
    这篇文章主要介绍php生成文件名乱码的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php生成文件名乱码的解决办法:1、将所有的+号替换为“%20”;2、添加“header("Content-typ...
    99+
    2023-06-14
  • springboot集成redis并生成全局唯一索引ID的方法
    本篇内容主要讲解“springboot集成redis并生成全局唯一索引ID的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot集成redis并生成全局唯一索引ID的方法”吧!...
    99+
    2023-06-29
  • python生成式的send()方法(详解)
    随便在网上找了找,感觉都是讲半天讲不清楚,这里写一下。 def generator(): while True: receive=yield 1 print('extra'+str(...
    99+
    2022-06-04
    详解 方法 python
  • JavaScript生成UUID的五种方法详解
    目录简介1.第一种2.第二种3.第三种4.第四种5.第五种简介 UUID(Universally Unique IDentifier) 全局唯一标识符。 UUID是一种由算法生成的二...
    99+
    2022-11-13
  • MySQL高并发生成唯一订单号的方法实现
    前言 这篇博文发布后,有朋友问有没有SQL server版本的,现在有了==》传送门 一、场景再现 在一个erp进销存系统或0A等其他系统中,如果多人同时进行生成订单号的操作的话,容易出现多人获得同一个订单号的情况,...
    99+
    2022-05-18
    MySQL高并发生成唯一订单号 MySQL 生成唯一订单号
  • MySQL高并发生成唯一订单号的方法是什么
    这篇文章主要介绍了MySQL高并发生成唯一订单号的方法是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。一、场景再现在一个erp进销存系统或0...
    99+
    2022-10-18
  • Python生成直方图方法实现详解
    目录1. 引言2. 生成数据3. 使用Matplotlib绘制直方图4. 使用Pandas绘制直方图5. 总结1. 引言 你想知道如何在Python中生成直方图吗?在本教程中,我将向...
    99+
    2022-11-16
    Python生成直方图 Python直方图 Python绘制直方图
  • java web在高并发和分布式下实现订单号生成唯一的解决方案
    方案一:如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单。如果存在并发,且订单号是由一个进程中的多个线程产生的,那么只要把线程ID添加到序列号...
    99+
    2023-05-30
    java web 高并发
  • PHP 生成器的使用详解
    目录什么是生成器? 生成器有什么用? 生成器的应用 返回空值以及中断 返回键值对形式 外部传递数据 yield from 语法 小惊喜 生成器可以用count获取数量吗? 使用生产器...
    99+
    2022-11-12
  • php生成小程序二维码乱码的解决方法
    这篇文章给大家分享的是有关php生成小程序二维码乱码的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php生成小程序二维码乱码的解决办法:1、获取微信token;2、添加“base64_encode($r...
    99+
    2023-06-21
  • MybatisPlus代码生成器的使用方法详解
    搭建测试的数据库和表数据的SQL SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- -------------------...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作