【问题标题】:Generate a random filename in C++在 C++ 中生成随机文件名
【发布时间】:2015-12-08 20:16:07
【问题描述】:

我正在开发 C++ 中的对象检测应用程序。而且我存储了每个假阴性图像,所以我需要一个随机文件名生成器,它不应该重复它们。

我目前正在使用tmpnam,但它不保证唯一性,因此文件可能会被覆盖,因为所有文件都存储在同一个文件夹中。

我正在寻找任何其他方式来生成唯一的文件名。

【问题讨论】:

  • 文件名中的时间戳是否有任何原因不起作用?
  • 生成一个 GUID(全局唯一标识符)并在文件名中使用它。
  • tmpnam 确实保证唯一性,尽可能在其他进程可以与您的进程同时创建文件的系统上。只要没有其他人写入您的目录并且您创建的文件不超过TMP_MAX 文件(TMP_MAX 必须至少为 25 个),您就不会得到重复的名称。
  • @PeteBecker:所以你保证有 25 个唯一的文件名?现在这听起来不像是一个非常有用的功能。使用 GUID 作为文件名已经比这更好了,并且不会因并发调用而遭受冲突。
  • @koruj - 你使用的特定运行时库是 238328;它可能因其他编译器而异。尽管如此,25 只是最低限度,如果任何系统仅提供 25 个唯一名称,我会感到惊讶。而且,是的,它会检查目录中的名称以确保它没有提供重复的名称。不能保证它是唯一的唯一原因是其他人创建了一个具有该名称的文件之后 tmpnam检查的可能性;有一个非常狭窄的时间窗口。这是任何系统生成名称的问题,包括使用 GUID 的系统。

标签: c++ opencv random filenames


【解决方案1】:

我建议使用 GUID。如前所述,它们不是 100% 保证的,但出于您的目的,它们可能会很好。

我已附上代码:

#include <Windows.h>
#include <iostream>
#include <objbase.h>

int main()
{
    GUID guid;
    CoCreateGuid(&guid);

    printf("%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX",
        guid.Data1, guid.Data2, guid.Data3,
        guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
        guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
    system("pause");
    return 0;
}

这将返回唯一名称32 hex digits grouped into chunks of 8-4-4-4-12

在我的机器上运行代码时,它提供了一个 GUID:CAF9B27A-AA9E-46DE-9966-C3EDBE5D674F

希望这会有所帮助。

【讨论】:

  • 请注意,这仅适用于 Windows。有可用于其他系统的 UUID 库。
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2011-02-17
  • 2013-01-19
  • 2010-10-15
相关资源
最近更新 更多