一文解决PHP中生成随机数遇到的重复问题

 更新时间:2023年12月19日 09:51:16   作者:小柳666  
项目开发中很多地方需要用到唯一编码,比如说订单、卡券、邀请码等等,这些编号是需要严格保证唯一性的,因为如果系统中订单的编号存在俩一模一样的,那造成很多数据的错乱,所以本文给大家介绍了如何解决PHP中生成随机数遇到的重复问,需要的朋友可以参考下

场景描述

项目开发中很多地方需要用到唯一编码,比如说订单、卡券、邀请码等等。这些编号是需要严格保证唯一性的,因为如果系统中订单的编号存在俩一模一样的,那造成很多数据的错乱。实现唯一编码的方式也是很多的,一般是通过底层的一些随机函数 mt_rand() uniqid()等等。

探索实现方式一

    public static function uniqidNumberCode($length = 10)
    {
        $time = time() . '';
        if ($length < 10) $length = 10;
        $string = ($time[0] + $time[1]) . substr($time, 2) . rand(0, 9);
        while (strlen($string) < $length) $string .= rand(0, 9);
        return $string;
    }

上面这个是用的三方包中的生成方式。参数中可以设置当前生成的编号长度。以当前时间的时间戳为基础数据,计算出10位随机数字。当我们单次去执行的时候,生成的数据是非常正确的。

但是,当我们需要批量的生成一堆的随机编号的时候

可以发现,以肉眼可见的速度出现了一堆的重复数据。

探索方式二

请教了一下chatgpt,让它生成一个方法如下

function generateUniqueNumber($length = 10) {
    // 生成一个唯一标识符
    $uniqueId = uniqid();

    // 移除标识符中的前缀并截取前10位
    $uniqueNumber = substr($uniqueId, strlen($uniqueId) - 10);

    return $uniqueNumber;
}

还是测试一下批量生成的场景。

虽然生成的数据看着正确,但是数据格式不是怎么的让人可以接受。还是希望生成10位纯数字的。

探索方式三

再一次请教了一下chatgpt。

function generateUniqueNumber($length = 10) {
    // 获取当前时间戳
    $timestamp = time();

    // 生成一个随机数,确保足够的随机性
    $randomNumber = mt_rand(100, 999);

    // 组合时间戳和随机数,并截取前10位
    $uniqueNumber = substr($timestamp . $randomNumber, 0, 10);

    return $uniqueNumber;
}

这下可好,生成的数据完全的毫无区别了。看来虽然gpt能帮助我们很多,但是选择还是需要谨慎些。一些关键逻辑如果出现严重问题可是不太好交差的。

探索方式四

我们尝试用php底层的生成随机数的函数 mt_rand() 对数据进行生成。

function generateUniqueNumber($length = 10) {
    $uniqueNumber = mt_rand(1000,9999);

    return $uniqueNumber;
}

发现在某些特殊的情况下还是会出现重复数据的可能。

探索实现方式二

//生成10位随机数
function generateUniqueNumber() {
    list($usec, $sec) = explode(' ', microtime());
    $seed = (float) $sec + ((float) $usec * 100000);
    mt_srand($seed);
    return mt_rand(1000000000,9999999999);
}

在mt_rand函数的基础上,生成随机数之前。对随机数发生器的种子也用毫秒的值进行重新生成。然后再将mt_rand函数的区间尽量去放大。

这样基本可以满足需求,但是却是无法保证万无一失。程序这东西嘛,保证数据准确才是永远的追求。为了准确,我又给数据库的唯一编号字段加了唯一索引。这样就在数据库层面上保证了生成的编号肯定是唯一的。

当然,如果在生成编号以后,程序再主动去数据库中查询一遍字段是否存在,然后再执行下面的业务这就更好了。

以上是整个分析过程,不足之处或者更好方案欢迎给我留言。

以上就是一文解决PHP中生成随机数遇到的重复问题的详细内容,更多关于PHP中生成随机数遇到重复的资料请关注脚本之家其它相关文章!

相关文章

  • php 调试利器debug_print_backtrace()

    php 调试利器debug_print_backtrace()

    debug_print_backtrace() 是一个很低调的函数,很少有人注意过它. 不过当我对着一个对象调用另一个对象再调用其它的对象和文件中的一个函数出错时,它正在一边笑呢
    2012-07-07
  • php项目中类的自动加载实例讲解

    php项目中类的自动加载实例讲解

    在本篇文章里小编给大家整理的是关于php项目中类的自动加载的实例内容以及相关代码,需要的朋友们学习下。
    2019-09-09
  • 详解PHP如何读取大文件

    详解PHP如何读取大文件

    作为PHP开发人员,我们不需要担心内存管理。在极少数情况下,我们可能需要走出舒适的界限—例如,当我们尝试在可以创建的最小VPS上为大型项目运行Composer时,或者需要在同样小的服务器上读取大文件时。这是我们将在本教程中讨论的一个问题。
    2021-05-05
  • 通过JavaScript或PHP检测Android设备的代码

    通过JavaScript或PHP检测Android设备的代码

    在此列出一些能够在iOS的最大竞争者——安卓(Android)系统的检测方法。即通过JavaScript或PHP检测Android设备,给大家提供参考。
    2011-03-03
  • PHP常用开发函数解析之数组篇[未完结]

    PHP常用开发函数解析之数组篇[未完结]

    数组处理函数在PHP开发中非常常见,学习好数组处理函数至关重要.数组处理函数在实际应用中涉及到:数组的创建,字符串于数组的相互转换,数组转XML,数组转JSON.数组的检测.数组的合并于分割.数组的数目.获取数组中的所有值,获取数组中的所有键值
    2012-07-07
  • MyEclipse常用配置图文教程

    MyEclipse常用配置图文教程

    本文主要是记录一些有用的设置技巧,并且是图文并茂,像创建项目,创建类,设置工作空间等在这里就不做介绍了,而且之前的文章也有涉猎。
    2014-09-09
  • 详解PHP防止直接访问.php 文件的实现方法

    详解PHP防止直接访问.php 文件的实现方法

    这篇文章主要介绍了详解PHP防止直接访问.php 文件的实现方法的相关资料,这里提供实现禁止直接访问.php文件的实例,需要的朋友可以参考下
    2017-07-07
  • PHP+Ajax实时自动检测是否联网的方法

    PHP+Ajax实时自动检测是否联网的方法

    这篇文章主要介绍了PHP+Ajax实时自动检测是否联网的方法,通过Ajax调用连接百度效果实现检测网站是否联网的功能,需要的朋友可以参考下
    2015-07-07
  • php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例

    php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例

    这篇文章主要介绍了php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率,结合完整实例形式对比分析了php分别使用mysqli和pdo扩展连接mysql数据库的执行时间,需要的朋友可以参考下
    2019-05-05
  • php你的验证码安全码?

    php你的验证码安全码?

    php你的验证码安全码?...
    2007-01-01

最新评论