Ser*_*gey 0 c networking network-programming
我需要快速生成有效的ip号码(保留的ips也是有效的).现在我使用这个:
unsigned char *p_ip;
unsigned long ul_dst;
p_ip = (unsigned char*) &ul_dst;
for(int i=0;i<sizeof(unsigned long);i++)
*p_ip++ = rand()%255;
ip.sin_addr.s_addr = ul_dst;
Run Code Online (Sandbox Code Playgroud)
但有时它会生成无效数字,但此代码可以在一秒内生成大约10k的有效ips.谁能贡献?谢谢
调用rand()可能是代码中最慢的部分,如果你使用http://en.wikipedia.org/wiki/Multiply-with-carry中的随机函数的实现
这是一个用于生成随机数的超快C函数.
存储sizeof(unsigned long)在注册变量中,即:
register int size = sizeof(unsigned long)
还应该有所帮助.
由于您使用4个字符= 4 x 8字节内存,因此您可以使用32位整数,只需要一个内存地址.结合比特移位,新的随机方法,注册变量,应该减少相当多的运行时间.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
uint32_t ul_dst;
init_rand(time(NULL));
uint32_t random_num = rand_cmwc();
ul_dst = (random_num >> 24 & 0xFF) << 24 |
(random_num >> 16 & 0xFF) << 16 |
(random_num >> 8 & 0xFF) << 8 |
(random_num & 0xFF);
printf("%u\n",ul_dst);
return 0;
Run Code Online (Sandbox Code Playgroud)
在这段代码之上,我有来自维基百科的随机函数的精确副本.希望这会跑得更快.我们知道32位int的大小是4*8所以不再需要sizeof,而不是%255我用255位掩码替换它