php生成不重复唯一标识 session_create_id()的用法

2024年09月03日 建站教程

session_create_id()是php 7.1新增的函数,用来生成session id,低版本无法使用。下面给大家介绍一下session_create_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>';
}

本文链接:http://so.lmcjl.com/news/12151/

展开阅读全文
相关内容