随机数C扩展随机数

随机数C扩展随机数
由于使用了固定长度的随机字符串。

首先,一段PHP代码
str_md5美元= MD5(uniqid());
(1, 28)mt_rand兰德=美元;
str1 = substr(str_md5美元美元,$兰德,6);
(1, 28)mt_rand兰德=美元;
str2 = substr(str_md5美元美元,$兰德,6);
(1, 28)mt_rand兰德=美元;
但美元= substr(str_md5美元美元,兰德,6);
代码= substr(美元美元美元美元str3,0,8 str1,str2。);
生成180000个随机字符串,图片按重复次数排列,可以看到基本重复,但也是理想的。

因为想提高C语言能力,所以用C重写了随机生成字符串。

随机数函数srand()()、伦德()使用。

但在一个或两个小时,随机数仍是个问题。并发访问的时间可能会几乎在同一时间,然后播种期的站可以被认为是相同的。这导致随机数相同的数量。由此产生的随机字符串相同的随机字符串的循环输出。几乎是相同的。

后来,我想到UKey,可以实现独特的ID,以便访问生成一个唯一的ID,并有可能使用这个ID作为种子的时间,答案是肯定的。
上面的图片是一个随机字符串,它可以自定义长度,也可以输出只有一个数字的字符串,PHP生成的随机字符串的重复率更低,速度更快。
php_function(get_random__num_str)
{
int长度= 8;

如果(zend_parse_parameters(zend_num_args)(tsrmls_cc,L,长度)=失败)
{
长度= 8;

}
长度+;
i标志;
字符串;
__uint64_t timestamp =实时();
用__uint64_t;
Int len;
中字符{ 128 };

如果(时间戳= = 0ull){
return_false;
}

spin_lock(锁,PID);

如果(背景-> last_timestamp = =时间戳){
背景->序列=(背景->序列+ 1)背景-> sequence_mask;
如果(上下文>序列= 0){
时间= skip_next_millis();
}

{人}
上下文>序列= 0;返回到零*
}

背景- > last_timestamp =时间戳;

retval =((时间戳-背景- > twepoch)timestamp_left_shift)
|(背景-> datacenter_id datacenter_id_shift)
|(worker_id worker_id_shift)
|背景->序列;

spin_unlock(锁,PID);
/ / printf(%ld,用);
Srand(((unsigned)用);
/ / srand((unsigned)时间(空));
(如果(String =(char *)emalloc(长度))= = null)
{
/ / Mylog(malloc失败!标志:14 ;
return_null();
}

对于(i = 0;i <长度1;i +)
{
标志=兰德()% 3;

开关(旗)
{
案例0:
字符串{我} = 1+ RAND()% 5;
打破;
案例1:
字符串{我} = 2 + RAND()% 7;
打破;
案例2:
字符串{我} = 0+ RAND()% 10;
打破;
违约:
字符串{我} = 9;
打破;
}
}
字符串{长度- 1 } = 0;
return_stringl(字符串,长度,0);
}
php_function(get_random_str)
{
int长度= 8;

如果(zend_parse_parameters(zend_num_args)(tsrmls_cc,L,长度)=失败)
{
长度= 8;

}
长度+;
i标志;
字符串;
__uint64_t timestamp =实时();
用__uint64_t;
Int len;
中字符{ 128 };

如果(时间戳= = 0ull){
return_false;
}

spin_lock(锁,PID);

如果(背景-> last_timestamp = =时间戳){
背景->序列=(背景->序列+ 1)背景-> sequence_mask;
如果(上下文>序列= 0){
时间= skip_next_millis();
}

{人}
上下文>序列= 0;返回到零*
}

背景- > last_timestamp =时间戳;

retval =((时间戳-背景- > twepoch)timestamp_left_shift)
|(背景-> datacenter_id datacenter_id_shift)
|(worker_id worker_id_shift)
|背景->序列;

spin_unlock(锁,PID);
/ / printf(%ld,用);
Srand(((unsigned)用);
/ / srand((unsigned)时间(空));
(如果(String =(char *)emalloc(长度))= = null)
{
/ / Mylog(malloc失败!标志:14 ;
return_null();
}

对于(i = 0;i <长度1;i +)
{
标志=兰德()% 3;

开关(旗)
{
案例0:
字符串{我} = a + rand()% 26;
打破;
案例1:
字符串{我} = a + rand()% 26;
打破;
案例2:
字符串{我} = 0+ RAND()% 10;
打破;
违约:
字符串{我} = 'x';
打破;
}
}
字符串{长度- 1 } = 0;
return_stringl(字符串,长度,0);
}

上面的数字是PHP用来生成随机字符串的时间。
上图是C扩展用来生成一个随机字符串的时间。

所使用的服务都是1G内存双核Ali云服务器。

一个随机的字符串和一个随机长度的数字串可以生产只要代码添加到UKey,和PHP独特的ID生成扩展UKey。

ini的配置项:
{ UKey }
ukey.datacenter =整数
ukey.worker =整数
ukey.twepoch = UInt64
数据中心配置项是用于设置数据中心的整数。

工人配置项是一个整数,用于设置数据中心的机器序列号;

的twepoch配置项是一个64位的整数,这是用来设置时间戳的基地,和更大的价值,小生成的ID。

安装
美元/ UKey的CD。
phpize美元
$ /配置
为使
$ sudo make install
详细说明:提供了3个有用的功能

ukey_next_id(),用来生成唯一的ID

ukey_to_timestamp(ID),用于转换的身份进入一个时间戳

ukey_to_machine(ID),用于转换成机器信息ID

举个例子:

< PHP
$id = ukey_next_id ();
回波$ id;

时间= ukey_to_timestamp美元($ ID);
回声号('y-m-d H:我:',$时间戳);

$信息= ukey_to_machine($id)
var_dump(元信息);
>
以上是本文的全部内容,希望能对大家有所帮助。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部