我有一个工具,每次启动时都需要创建一个唯一的目录。

该工具可以在同一秒上多次启动

当我使用常规的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/

10-13 08:16