我想生成插入 SQLite 数据库的 guid(即数据库本身不支持)。但是,我想控制某些属性:
- 用于生成不断增加的指导值的有序性。
- 计算机独立性。数据库是公共的,可能/可能不希望 guid 允许某人将数据追溯到特定机器。
- “足够”的随机性。 guid 是数据库中的键,它将与许多其他数据库合并,并且可能会变得非常大,这意味着像许多算法那样伪造 guid 是不好的。
- 我可以使用系统特定的 API 来处理,但请链接 Windows 和 Linux 函数,并且首选 SQLite 之类的东西,我可以在其中使用其他人编写的代码。
- 我还更喜欢可以在商业应用程序中使用的代码。
寻找创建包含作者正在寻找的许多元素的 GUID 的答案的一个地方是 PHP 。https://www.php.net/uniqid https://www.php.net/uniqid.. 在他们的示例中,他们讨论了如何将服务器名称、数据库名称和其他元素添加到 GUID。
然而,为了满足对基于 C 的 GUID 函数的需求,这里是基于 JavaScript 函数的代码..如何创建 GUID/UUID? https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript..此示例使用 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);
注意:字符串以 0x00 字符结尾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)