zoukankan      html  css  js  c++  java
  • PHP 生成不重复唯一标识 session_create_id()

    PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳。在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据。即使使用了第二个参数,也会重复。

    使用session_create_id()函数生成唯一标识符,经过实际测试发现,即使循环调用session_create_id()一亿次,都没有出现过重复。
    php session_create_id()是php 7.1新增的函数,用来生成session id,低版本无法使用。

    PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳。在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据。即使使用了第二个参数,也会重复。

    使用session_create_id()函数生成唯一标识符,经过实际测试发现,即使循环调用session_create_id()一亿次,都没有出现过重复。
    php session_create_id()是php 7.1新增的函数,用来生成session id,低版本无法使用。

    <?php
    /**
     * PHP生成唯一RequestID类
     * Version: 1.0
     */
    class RequestID{ // class start
     
        /**
        * 生成唯一请求id
        * session_create_id 需要php7.1以上版本
        * @return String
        */
        public static function generateV7(){
            // 使用session_create_id()方法创建前缀
            $prefix = session_create_id(date('YmdHis'));
            // 使用uniqid()方法创建唯一id
            $request_id = strtoupper(md5(uniqid($prefix, true)));
            // 格式化请求id
            return self::format($request_id);
        }
    
        public static function generate(){
            // 创建前缀
            $prefix = self::create_guid(date('YmdHis'));
            // 使用uniqid()方法创建唯一id
            $request_id = strtoupper(md5(uniqid($prefix, true)));
            // 格式化请求id
            return self::format($request_id);
        }
    
        public static function create_guid($namespace = '') {  
            static $guid = '';
            $uid = uniqid("", true);
            $data = $namespace;
            $data .= $_SERVER['REQUEST_TIME'];
            $data .= $_SERVER['HTTP_USER_AGENT'];
            $data .= isset($_SERVER['LOCAL_ADDR'])?$_SERVER['LOCAL_ADDR']:$_SERVER['SERVER_ADDR'];
            $data .= isset($_SERVER['LOCAL_PORT'])?$_SERVER['LOCAL_PORT']:$_SERVER['SERVER_PORT'];
            $data .= $_SERVER['REMOTE_ADDR'];
            $data .= $_SERVER['REMOTE_PORT'];
            $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
            $guid = '{' . 
              substr($hash, 0, 8) .
              '-' .
              substr($hash, 8, 4) .
              '-' .
              substr($hash, 12, 4) .
              '-' .
              substr($hash, 16, 4) .
              '-' .
              substr($hash, 20, 12) .
              '}';
            return $guid;
        }
    
        /**
        * 格式化请求id
        * @param String $request_id 请求id
        * @param Array $format  格式
        * @return String
        */
        private static function format($request_id, $format='8,4,4,4,12'){
            $tmp = array();
            $offset = 0;
            $cut = explode(',', $format);
            // 根据设定格式化
            if($cut){
                foreach($cut as $v){
                    $tmp[] = substr($request_id, $offset, $v);
                    $offset += $v;
                }
            }
            // 加入剩余部分
            if($offset<strlen($request_id)){
                $tmp[] = substr($request_id, $offset);
            }
            return implode('-', $tmp);
        }
    } // class end
    
    // 生成10个请求id
    for($i=0; $i<10; $i++){
     echo RequestID::generate().PHP_EOL.'<br>';
    }

  • 相关阅读:
    MS MDS系列之MDS层次结构(Hierarchy)
    Tabular系列之问题1:如何利用其他人的账号进行权限测试?
    MS MDS系列之初识MS Master Data Service(微软主数据服务)
    SQL Server系列之SQL Server 2016 中文企业版详细安装步骤(超多图)
    Pivot Table系列之切片器 (Slicer)
    Pivot Table系列之展开/折叠用法 (Expand/Collapse)
    MyBatis逆向工程——Java代码自动生成
    汇智网练习:修改示例代码,使EzApp组件的标题颜色每秒钟随机变化一次
    关于事件模型,js事件绑定和解除的学习
    使用block进行界面之间的反向传值
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15847719.html
Copyright © 2011-2022 走看看