我有一个工具,每次启动时都需要创建一个唯一的目录。
该工具可以在同一秒上多次启动
当我使用常规的srand(time(NULL))
和rand()
时,如果我的工具在同一秒内多次启动,则会得到相同的“唯一”字符串。
这是我的问题的一个例子:$ ./rand_string.exe
9IQMT8F63P37G3LO4O85LM1LRTEBTV3Q1DOX3B46SAUYUBPYKDMZER9M8DAZSVPT
$ ./rand_string.exe
I01QZ47I0FV3WCW597NLE3M9B75Q5S5ADFB23T4OZR0W2VM2E91XJYHWGGVMEAE0
# Time is still the same, getting same "unique" string
$ ./rand_string.exe
I01QZ47I0FV3WCW597NLE3M9B75Q5S5ADFB23T4OZR0W2VM2E91XJYHWGGVMEAE0
# Time is still the same, getting same "unique" string
$ ./rand_string.exe
I01QZ47I0FV3WCW597NLE3M9B75Q5S5ADFB23T4OZR0W2VM2E91XJYHWGGVMEAE0
$ ./rand_string.exe
LWNXWSTODGGC8B46JB0ZII950LJOPJ8EG3GEI885U58CLXHA3L0DBCXIX6I0I2SZ
$ ./rand_string.exe
UUY1245J9RO8O1G6OVEYBZUTK0PNGG9ER52JIQSN1MEUDGZEXHFBHJ6R6TJ74H1Q
$ ./rand_string.exe
3SP49GYF6HG4KAS7UVTELWWG4FW28UAY384PI8CLP3ZS50WIRXFTMQEKEWKE6DQY
# Time is still the same, getting same "unique" string
$ ./rand_string.exe
3SP49GYF6HG4KAS7UVTELWWG4FW28UAY384PI8CLP3ZS50WIRXFTMQEKEWKE6DQY
这是我的代码(仅对“随机”实现有意义):#include <cstdlib>
#include <ctime>
#include <iostream>
void cpy_rand_str(char *dest, int size) {
int i;
int rand_num;
srand (time(NULL));
for (i = 0 ; i < size ; i++) {
rand_num = rand() % 36;
if (rand_num >= 10) {
rand_num += ('A' - 10);
} else {
rand_num += '0';
}
dest[i] = (char)rand_num;
}
dest[size] = '\0';
}
int main() {
char my_key[64 + 1];
cpy_rand_str(my_key, 64);
std::cout << my_key << "\n";
return 0;
}
最佳答案
这几乎就是 tmpnam
设计要完成的。它并不完美(例如,它可以在比赛条件下使用),但至少有一定的工作机会,这比大多数明显的替代方案都多。另外,它生成的字符串专门用于符合主机要求的文件名,这通常意味着它可用作目录的名称。
关于c++ - C++:在同一秒多次启动的程序中生成唯一字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24668779/