独特的字串生成器

时间:2016-03-29 13:52:43

标签: c

我想制作一个程序(网络服务器 - 客户端)。 下一个是该程序的规范之一:

服务器将接收发送的包并将其保存到一个文件中,该文件具有唯一的名称(在传输开始时由服务器生成)。 Ex __tf _" unique_random_string" .txt

我做了一个函数,返回一个指向" unique"的指针。字符串创建。

问题是:如果我停止服务器然后再次启动它将生成相同的名称。

例如:生成了这个文件名,然后我停止了服务器。

__ ft_apqfwk.txt

__ ft_arzowk.txt

__ ft_cdyggx.txt

我再次启动它,我尝试生成3个文件名。他们将是一样的。

抱歉我的英文。我还在学习它。

我的功能是生成这个"唯一字符串"是:

char *create_random_name(void)
{
    const char charset[] = "abcdefghijklmnopqrstuvwxyz";
    char *file_name;
    int i=0;
    int key;
    if((file_name = malloc(16 * sizeof ( char )) ) == NULL)
    {
        printf("Failed to alloc memory space\n");
        return NULL;
    }
    strcpy(file_name,"__ft_");
    for(i=5 ; i<11 ; i++)
    {
        key = rand() % (int)(sizeof(charset)-1);
        file_name[i]=charset[key];
    }
    strcat(file_name,".txt");
    file_name[15] = '\0';
    return file_name;
}

4 个答案:

答案 0 :(得分:2)

一种选择是将已使用的名称保存到文件中,并将其用作清单。你还想用srand(time(NULL))之类的东西来种子兰特。

另一个是忽略了随机化,只是顺序排列,例如aaa,aab aac ... aba,abb等。再次,保存你的周期所在的文件。

答案 1 :(得分:1)

您的问题似乎有点不清楚,但如果您想要生成一个独特的字符串,您可以考虑以下几个方面:

  1. 获取系统时间戳(yyyy-MM-dd-HH-mm-ss-fff-tt)
  2. 使用随机函数生成随机数
  3. 将此功能与您的功能相结合,我相信您将获得一个独特的字符串。

    希望它有所帮助!

答案 2 :(得分:0)

如果它可用,您可以避免手动生成可能发生冲突的随机名称,并让系统为您执行此操作(并通过使用mkstemps创建新名称来处理冲突解决)。这也更安全,因为它会为您打开文件,消除生成随机名称,验证为唯一的风险,然后尝试打开它并发现另一个参与的线程/进程并创建它。

char name[] = "/path/to/put/files/in/__ft_XXXXXX.txt";
int fd = mkstemps(name, strlen(".txt"));
if (fd == -1) { ... handle error ... }

mkstemps成功后,name将保留文件的路径(它已就位变异,替换XXXXXX字符串),fd将是一个打开的文件描述符到新创建的文件;如果您需要FILE*,请使用fdopen转换为stdio类型。

答案 3 :(得分:0)

在调用rand(),---一次且仅一次---之前,调用srand(time())来初始化随机数生成器。

在确定任何特定文件名之前,请调用stat()以确保文件名尚不存在。