如何在C中生成GUID?

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

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

您可以使用或查看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函数

  • CryptAcquireContext获取随机上下文
  • CryptReleaseContext释放获取的随机上下文
  • CryptGenRandom生成足够的字节来组成GUID / UUID

其他实现

GUID / UUID上的Wikipedia页面列出了您可以使用/研究的替代实现:

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

关于你的条件

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

现在,您希望及时订购GUID / UUID。 在不削弱GUID / UUID随机性的情况下执行该操作的唯一方法是在16字节GUID / UUID前加上无符号整数(这将使您的标识符数据为20字节或更多,具体取决于您的整数)。 只需生成GUID / UUID,然后增加整数。

寻找创建包含作者正在寻找的许多元素的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 

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

首先,GUID不是随机的,它们的数学定义很好。

至于您的问题,将GUID创建作为存储过程放入数据库本身,这样系统与平台无关。 然后,使GUID成为一个前缀为数据库ID的自动递增整数。 前缀允许轻松合并数据库。 每个数据库的数据库ID都必须是唯一的。 如果您控制每个数据库,则可以直接确保这些数据库是唯一的。 否则,您可能需要一个查找系统,该系统将数据库IP地址(或其他一些唯一标识符)映射到唯一的数据库ID。

如果您没有存储过程,则创建一个包含“NextIndex”和“DatabaseID”字段的表,并在添加新记录时更新它们:

 read NextIndex and DatabaseID increment NextIndex ID = NextIndex + DatabaseID add new record, setting "GUID" to the ID value