Rumah >pembangunan bahagian belakang >masalah PHP >Bagaimana untuk mencapai nilai unik bukan pendua dalam php

Bagaimana untuk mencapai nilai unik bukan pendua dalam php

藏色散人
藏色散人asal
2022-11-03 09:59:081254semak imbas

Cara melaksanakan nilai unik unik dalam PHP: 1. Anda boleh menggunakan fungsi "uniqid()" untuk menjana pengecam unik yang tidak berulang; 2. Anda boleh menggunakan fungsi "session_create_id()". untuk menjana pengecam unik; 3. Pengecam unik boleh dijana menggunakan fungsi "session_create_id()".

Bagaimana untuk mencapai nilai unik bukan pendua dalam php

Persekitaran pengendalian tutorial ini: sistem Windows 7, PHP versi 8.1, komputer Dell G3.

Bagaimana untuk mencapai nilai unik bukan pendua dalam PHP?

PHP menjana pengecam unik unik session_create_id()

Fungsi PHP uniqid() boleh digunakan untuk menjana pengecam unik unik berdasarkan cap masa semasa peringkat mikrosaat. Dalam kes konkurensi yang tinggi atau selang yang sangat singkat (seperti kod gelung), sejumlah besar data pendua akan muncul. Ini diulang walaupun hujah kedua digunakan.

Gunakan fungsi session_create_id() untuk menjana pengecam unik Selepas ujian sebenar, didapati bahawa walaupun session_create_id() dipanggil secara kitaran 100 juta kali, tiada penduaan.

php session_create_id() ialah fungsi baharu dalam PHP 7.1 Ia digunakan untuk menjana id sesi. Ia tidak boleh digunakan dalam versi yang lebih rendah.

Fungsi PHP uniqid() boleh digunakan untuk menjana pengecam unik unik berdasarkan cap masa semasa dalam mikrosaat. Dalam kes konkurensi yang tinggi atau selang yang sangat singkat (seperti kod gelung), sejumlah besar data pendua akan muncul. Ini diulang walaupun hujah kedua digunakan.

Gunakan fungsi session_create_id() untuk menjana pengecam unik Selepas ujian sebenar, didapati bahawa walaupun session_create_id() dipanggil secara kitaran 100 juta kali, tiada penduaan.

php session_create_id() ialah fungsi baharu dalam PHP 7.1 Ia digunakan untuk menjana id sesi. Ia tidak boleh digunakan dalam versi yang lebih rendah.

<?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(&#39;YmdHis&#39;));
        // 使用uniqid()方法创建唯一id
        $request_id = strtoupper(md5(uniqid($prefix, true)));
        // 格式化请求id
        return self::format($request_id);
    }
 
    public static function generate(){
        // 创建前缀
        $prefix = self::create_guid(date(&#39;YmdHis&#39;));
        // 使用uniqid()方法创建唯一id
        $request_id = strtoupper(md5(uniqid($prefix, true)));
        // 格式化请求id
        return self::format($request_id);
    }
 
    public static function create_guid($namespace = &#39;&#39;) {  
        static $guid = &#39;&#39;;
        $uid = uniqid("", true);
        $data = $namespace;
        $data .= $_SERVER[&#39;REQUEST_TIME&#39;];
        $data .= $_SERVER[&#39;HTTP_USER_AGENT&#39;];
        $data .= isset($_SERVER[&#39;LOCAL_ADDR&#39;])?$_SERVER[&#39;LOCAL_ADDR&#39;]:$_SERVER[&#39;SERVER_ADDR&#39;];
        $data .= isset($_SERVER[&#39;LOCAL_PORT&#39;])?$_SERVER[&#39;LOCAL_PORT&#39;]:$_SERVER[&#39;SERVER_PORT&#39;];
        $data .= $_SERVER[&#39;REMOTE_ADDR&#39;];
        $data .= $_SERVER[&#39;REMOTE_PORT&#39;];
        $hash = strtoupper(hash(&#39;ripemd128&#39;, $uid . $guid . md5($data)));
        $guid = &#39;{&#39; . 
          substr($hash, 0, 8) .
          &#39;-&#39; .
          substr($hash, 8, 4) .
          &#39;-&#39; .
          substr($hash, 12, 4) .
          &#39;-&#39; .
          substr($hash, 16, 4) .
          &#39;-&#39; .
          substr($hash, 20, 12) .
          &#39;}&#39;;
        return $guid;
    }
 
    /**
    * 格式化请求id
    * @param String $request_id 请求id
    * @param Array $format  格式
    * @return String
    */
    private static function format($request_id, $format=&#39;8,4,4,4,12&#39;){
        $tmp = array();
        $offset = 0;
        $cut = explode(&#39;,&#39;, $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(&#39;-&#39;, $tmp);
    }
} // class end
 
// 生成10个请求id
for($i=0; $i<10; $i++){
 echo RequestID::generate().PHP_EOL.&#39;<br>&#39;;
}

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Bagaimana untuk mencapai nilai unik bukan pendua dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn