如何在C中生成GUID?

cha*_*m15 4 c uuid guid

我想生成guid以插入到SQLite数据库中(即不支持db本身).但是,我想控制某些属性:

  1. 用于生成增加的guid值的顺序.
  2. 电脑独立.数据库是公共的,可能/可能不希望guids允许某人将数据跟踪回特定的计算机.
  3. '足够'随机性.guid是db中的键,它将与许多其他dbs合并,并且可以变得非常大,这意味着伪造像许多算法那样的guid是不行的.
  4. 我可以处理使用系统特定的API,但请链接Windows和Linux功能,并且首选SQLite之类的东西,我可以使用别人写的代码.
  5. 我也更喜欢在商业应用程序中使用的代码.

E N*_*rch 5

寻找创建包含作者正在寻找的许多元素的GUID的答案的地方是PHP .. http://us3.php.net/uniqid ..在他们的例子中,他们讨论如何添加服务器GUID的名称,数据库名称和其他元素.

但是,为了满足基于C的GUID函数的需要,这里是基于JavaScript函数的代码.在JavaScript中创建GUID/UUID?..此示例使用RegEx创建GUID.

下面是将基于JavaSCript示例创建GUID的代码.我相信那里有更优雅的解决方案.这是拼凑在一起的东西,有助于为其他人提供一个干净的榜样.

srand (clock());
char GUID[40];
int t = 0;
char *szTemp = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
char *szHex = "0123456789ABCDEF-";
int nLen = strlen (szTemp);

for (t=0; t<nLen+1; t++)
{
    int r = rand () % 16;
    char c = ' ';   

    switch (szTemp[t])
    {
        case 'x' : { c = szHex [r]; } break;
        case 'y' : { c = szHex [r & 0x03 | 0x08]; } break;
        case '-' : { c = '-'; } break;
        case '4' : { c = '4'; } break;
    }

    GUID[t] = ( t < nLen ) ? c : 0x00;
}

printf ("%s\r\n", GUID);
Run Code Online (Sandbox Code Playgroud)

注意:字符串以0x00字符结尾.


pae*_*bal 4

您可以使用或查看 Boost.Uuid 的代码:

http://www.boost.org/doc/libs/1_47_0/libs/uuid/index.html

它是一个 C++ 库,但您仍然可以在内部找到代码作者如何在多个系统上检索 Uuid。上次我检查时(2010 年 1 月),我至少发现了以下针对 Windows 和 Linux/Solaris 的实现(此信息可能已过时):

Linux/Solaris 上的 UUID/GUID

打开文件并/dev/urandom读取足够的字节 (16) 来组成 GUID/UUID。

Windows 上的 UUID/GUID

使用以下 WinAPI 函数

其他实现

关于 GUID/UUID 的维基百科页面有一个您可以使用/研究的替代实现的列表:

https://en.wikipedia.org/wiki/UUID#Implementations

关于你的条件

有一个 GUID/UUID 类型始终是随机的(版本4),这意味着为了与其他 GUID/UUID 语义兼容,您应该尊重这一点。

现在,您希望及时订购 GUID/UUID。在不削弱 GUID/UUID 随机性的情况下做到这一点的唯一方法是在 16 字节 GUID/UUID 前面添加一个无符号整数(这将使您的标识符数据成为 20 字节或更多,具体取决于您的整数)。只需生成一个 GUID/UUID,并增加整数即可。