2015-12-08 227 views
2

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

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

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

+2

是否有任何原因文件名中的时间戳不起作用? – NathanOliver

+1

生成GUID(全局唯一标识符)并将其用于文件名称中。 – PaulMcKenzie

+4

'tmpnam' **确实**保证唯一性,就像其他一些进程可以在与您同时创建文件的系统上一样。只要没有其他人写入您的目录并且您没有创建超过TMP_MAX文件(“TMP_MAX”必须至少为25),您将不会获得重复的名称。 –

回答

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

希望这有助于。

+0

请注意,这仅适用于Windows。有UUID库可用于其他系统。 – PaulMcKenzie