• 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>';
    }

  • 相关阅读:
    解决:Requested 'libdrm_radeon >= 2.4.56' but version of libdrm_radeon is 2.4.52
    解决Ubuntun 12.04编译Mesa10.3 WARNING: 'aclocal-1.14' is missing on your system
    交叉编译Mesa,X11lib,Qt opengl
    Qt5.4.1移植到arm——Linuxfb篇
    Qt5.3.0的安装与测试
    gstreamer——文档/资源/使用
    gst-rtsp-server编译测试
    gstreamer-tips-picture-in-picture-compositing
    Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类
    Matlab实现单(双)极性(不)归零码
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15847719.html
Copyright © 2020-2023  润新知