最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP隨機(jī)數(shù) C擴(kuò)展隨機(jī)數(shù)

 更新時(shí)間:2016年05月04日 16:04:44   投稿:lijiao  
這篇文章主要介紹了PHP隨機(jī)數(shù),C擴(kuò)展隨機(jī)數(shù)的相關(guān)資料,還為大家介紹了PHP唯一ID生成擴(kuò)展ukey,感興趣的小伙伴們可以參考一下

由于要用到固定長度的隨機(jī)字符串。

首先是一段PHP代碼

$str_md5=md5(uniqid());
 $rand = mt_rand(1, 28);
 $str1=substr($str_md5,$rand,6);
 $rand = mt_rand(1, 28);
 $str2=substr($str_md5,$rand,6);
 $rand = mt_rand(1, 28);
 $str3=substr($str_md5,$rand,6);
 $code=substr($str1.$str2.$str3,0,8);


生成180000個(gè)隨機(jī)字符串,圖中是按照重復(fù)數(shù)量倒序排列,可以看到基本都有重復(fù)的。不過也是比較理想的。

由于想提升一下自己的C語言能力,所以用C重新寫了一下隨機(jī)生成字符串。

其中用到了隨機(jī)數(shù)函數(shù)srand(),rand();

不過折騰一兩個(gè)小時(shí),隨機(jī)數(shù)還是有問題。并發(fā)訪問時(shí)時(shí)間可能幾乎為同時(shí),那么srand給的種子時(shí)間可以視為相同的。這樣就導(dǎo)致了,產(chǎn)生的隨機(jī)數(shù)也是一樣的。從而產(chǎn)生的隨機(jī)字符串也是一樣的。循環(huán)輸出隨機(jī)字符串,幾乎都是一模一樣的。

后來想到了ukey,這個(gè)擴(kuò)展可以實(shí)現(xiàn)唯一的ID,那么訪問都產(chǎn)生唯一的ID,是不是可以將這個(gè)ID作為種子時(shí)間。答案是肯定的。

上圖是產(chǎn)生的隨機(jī)字符串,可以自定義長度。也同樣可以輸出只有數(shù)字的字符串。相較PHP所產(chǎn)生的隨機(jī)字符串重復(fù)率更低且速度更快。

 PHP_FUNCTION(get_random__num_str)
{
  int length=8;
  
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) 
  {
  length=8;
   
  }
  length++;
 int flag, i; 
 char* string; 
 __uint64_t timestamp = realtime();
 __uint64_t retval;
 int len;
 char buf[128];
 
 if (timestamp == 0ULL) {
  RETURN_FALSE;
 }
 
 spin_lock(lock, pid);
 
 if (context->last_timestamp == timestamp) {
  context->sequence = (context->sequence + 1) & context->sequence_mask;
  if (context->sequence == 0) {
   timestamp = skip_next_millis();
  }
 
 } else {
  context->sequence = 0; /* Back to zero */
 }
 
 context->last_timestamp = timestamp;
 
 retval = ((timestamp - context->twepoch) << context->timestamp_left_shift)
   | (context->datacenter_id << context->datacenter_id_shift)
   | (worker_id << context->worker_id_shift)
   | context->sequence;
 
 spin_unlock(lock, pid);
 //printf('%ld',retval);
 srand((unsigned)retval);
 //srand((unsigned) time(NULL )); 
 if ((string = (char*) emalloc(length)) == NULL ) 
 { 
  //myLog("Malloc failed!flag:14\n"); 
  RETURN_NULL() ; 
 } 
 
 for (i = 0; i < length - 1; i++) 
 { 
  flag = rand() % 3; 
   
  switch (flag) 
  { 
   case 0: 
    string[i] = '1' + rand() % 5; 
    break; 
   case 1: 
    string[i] = '2' + rand() % 7; 
    break; 
   case 2: 
    string[i] = '0' + rand() % 10; 
    break; 
   default: 
    string[i] = '9'; 
    break; 
  } 
   
   
   
 } 
 string[length - 1] = '\0'; 
 RETURN_STRINGL(string,length,0);
}
 PHP_FUNCTION(get_random_str)
{
  int length=8;
  
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) 
  {
  length=8;
   
  }
  length++;
 int flag, i; 
 char* string; 
 __uint64_t timestamp = realtime();
 __uint64_t retval;
 int len;
 char buf[128];
 
 if (timestamp == 0ULL) {
  RETURN_FALSE;
 }
 
 spin_lock(lock, pid);
 
 if (context->last_timestamp == timestamp) {
  context->sequence = (context->sequence + 1) & context->sequence_mask;
  if (context->sequence == 0) {
   timestamp = skip_next_millis();
  }
 
 } else {
  context->sequence = 0; /* Back to zero */
 }
 
 context->last_timestamp = timestamp;
 
 retval = ((timestamp - context->twepoch) << context->timestamp_left_shift)
   | (context->datacenter_id << context->datacenter_id_shift)
   | (worker_id << context->worker_id_shift)
   | context->sequence;
 
 spin_unlock(lock, pid);
 //printf('%ld',retval);
 srand((unsigned)retval);
 //srand((unsigned) time(NULL )); 
 if ((string = (char*) emalloc(length)) == NULL ) 
 { 
  //myLog("Malloc failed!flag:14\n"); 
  RETURN_NULL() ; 
 } 
 
 for (i = 0; i < length - 1; i++) 
 { 
  flag = rand() % 3; 
   
  switch (flag) 
  { 
   case 0: 
    string[i] = 'A' + rand() % 26; 
    break; 
   case 1: 
    string[i] = 'a' + rand() % 26; 
    break; 
   case 2: 
    string[i] = '0' + rand() % 10; 
    break; 
   default: 
    string[i] = 'x'; 
    break; 
  } 
   
   
   
 } 
 string[length - 1] = '\0'; 
 RETURN_STRINGL(string,length,0);
}


上圖是PHP生成18W隨機(jī)字符串所用的時(shí)間

上圖是C擴(kuò)展生成18W隨機(jī)字符串所用的時(shí)間

所用的服務(wù)器都是1G內(nèi)存 雙核的阿里云服務(wù)器。

只要在ukey中加入上如代碼就可以生產(chǎn)隨機(jī)字符串和隨機(jī)長度數(shù)字字符串,PHP唯一ID生成擴(kuò)展ukey。

php.ini的配置項(xiàng):

[ukey]
ukey.datacenter = integer
ukey.worker = integer
ukey.twepoch = uint64

datacenter配置項(xiàng)是一個(gè)整數(shù), 用于設(shè)置數(shù)據(jù)中心;
worker配置項(xiàng)是一個(gè)整數(shù), 用于設(shè)置數(shù)據(jù)中心的機(jī)器序號;
twepoch配置項(xiàng)是一個(gè)64位的整數(shù), 用于設(shè)置時(shí)間戳基數(shù), 此值越大, 生成的ID越小;

安裝:

$ cd ./ukey
$ phpize
$ ./configure
$ make
$ sudo make install 

Ukey提供3個(gè)有用的函數(shù):

ukey_next_id() -- 用于生成唯一ID
ukey_to_timestamp(ID) -- 用于將ID轉(zhuǎn)換成時(shí)間戳
ukey_to_machine(ID) -- 用于將ID轉(zhuǎn)換成機(jī)器信息

使用實(shí)例:

<?php
$id = ukey_next_id();
echo $id;
 
$timestamp = ukey_to_timestamp($id);
echo date('Y-m-d H:i:s', $timestamp);
 
$info = ukey_to_machine($id)
var_dump($info);
?>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • php讀取csv文件并輸出的方法

    php讀取csv文件并輸出的方法

    這篇文章主要介紹了php讀取csv文件并輸出的方法,涉及php中fgetcsv函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • PHP中時(shí)間處理類Carbon的用法詳解

    PHP中時(shí)間處理類Carbon的用法詳解

    Carbon?是php的日期處理類庫(A?simple?PHP?API?extension?for?DateTime.),繼承了PHP的?Datetime?類。本文將詳細(xì)講解一下該類的使用,需要的可以參考一下
    2022-05-05
  • PHP新特性詳解之命名空間、性狀與生成器

    PHP新特性詳解之命名空間、性狀與生成器

    這篇文章主要給大家介紹了關(guān)于PHP新特性之命名空間、性狀與生成器的相關(guān)資料,主要涉及到php中trait(性狀)與generator(生成器) 方面的內(nèi)容,對于php中trait(性狀)與generator(生成器) 感興趣的同學(xué)可以參考一下。
    2017-07-07
  • php頁碼形式分頁函數(shù)支持靜態(tài)化地址及ajax分頁

    php頁碼形式分頁函數(shù)支持靜態(tài)化地址及ajax分頁

    這篇文章主要介紹了php頁碼形式分頁函數(shù),此分頁支持靜態(tài)化地址分頁和無鏈接地址時(shí)的ajax分頁,需要的朋友可以參考下
    2014-03-03
  • XAMPP升級PHP版本實(shí)現(xiàn)步驟解析

    XAMPP升級PHP版本實(shí)現(xiàn)步驟解析

    這篇文章主要介紹了XAMPP升級PHP版本實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • PHP關(guān)鍵字Self、Static和parent的區(qū)別詳解

    PHP關(guān)鍵字Self、Static和parent的區(qū)別詳解

    在使用PHP代碼時(shí),您可能經(jīng)常會遇到parent::、static::和self::,但是當(dāng)你第一次作為一個(gè)開發(fā)人員開始的時(shí)候,有時(shí)候你會很困惑,不知道它們是做什么的,以及它們之間的區(qū)別,本文給大家介紹了PHP關(guān)鍵字Self、Static和parent的區(qū)別,需要的朋友可以參考下
    2024-12-12
  • PHP實(shí)現(xiàn)的猴王算法(猴子選大王)示例

    PHP實(shí)現(xiàn)的猴王算法(猴子選大王)示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)的猴王算法(猴子選大王),對比分析了兩種PHP猴王算法,涉及PHP數(shù)組遍歷、判斷、遞歸等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • PHP 命名空間和自動加載原理與用法實(shí)例分析

    PHP 命名空間和自動加載原理與用法實(shí)例分析

    這篇文章主要介紹了PHP 命名空間和自動加載,結(jié)合實(shí)例形式分析了PHP 命名空間和自動加載具體功能、概念、原理與使用技巧,需要的朋友可以參考下
    2020-04-04
  • php實(shí)現(xiàn)XSS安全過濾的方法

    php實(shí)現(xiàn)XSS安全過濾的方法

    這篇文章主要介紹了php實(shí)現(xiàn)XSS安全過濾的方法,實(shí)例分析了php針對XSS進(jìn)行安全過濾的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • PHP中strtr與str_replace函數(shù)運(yùn)行性能簡單測試示例

    PHP中strtr與str_replace函數(shù)運(yùn)行性能簡單測試示例

    這篇文章主要介紹了PHP中strtr與str_replace函數(shù)運(yùn)行性能簡單測試,結(jié)合具體實(shí)例形式對比分析了PHP中strtr與str_replace函數(shù)的測試運(yùn)行效率,需要的朋友可以參考下
    2019-06-06

最新評論

阿合奇县| 阿勒泰市| 海伦市| 太谷县| 通河县| 卢湾区| 海城市| 二连浩特市| 商南县| 宜丰县| 萝北县| 大渡口区| 海丰县| 义马市| 托克逊县| 屯门区| 醴陵市| 加查县| 拜泉县| 博罗县| 太保市| 建瓯市| 客服| 吉木乃县| 章丘市| 察隅县| 紫云| 津南区| 太仓市| 砚山县| 姚安县| 永平县| 兴海县| 阜新| 白水县| 揭东县| 织金县| 云南省| 岑溪市| 敦化市| 二连浩特市|