1

我读过一个类似的问题Raymond Chan 的博客文章,但仍然有一个关于使用缩短的 GUID 作为 id 的问题。我知道 GUID 是唯一的,但 GUID 的子字符串不是。

我正在建立一个网站,为用户提供订单参考号。客户不想使用自动递增的 Int,因为这会暴露订单总数。他们还认为 GUID 太长且难以通过电话重复。

但是,由于我们只有一个 Web 服务器,因此建议我们可以使用 GUID 的非 MAC 地址部分来提供更短的唯一标识符。

我的理解是当前的 GUID 算法不允许这样做。这个对吗?在同一台机器上创建的 GUID 可以缩短但仍然是唯一的吗?

4

2 回答 2

2

您仍然可以使用自动递增的 int(从 10000 开始),然后将其编码为加密的易于阅读/难以查找的字符串。这仍然保证结果是一个快速的唯一数字!

例如,这是您可以执行此操作的代码

https://stackoverflow.com/a/5901201/159270

和一些样本结果。

value: 9999999999 encoded: SrYsNt
value: 4294965286 encoded: ZNGEvT
value: 2292964213 encoded: rHd24J
value: 1000000000 encoded: TrNVzD

而对于加密它,你只需要打乱你的字符图,而普通用户只有很少的数字并且不知道它们之间的关系,他们无法重新创建它们。

现在,如果您赢得了使用 Guid 并且仍然搜索查找可以切断的内容,这里是它的源代码:http://www.webdav.org/specs/draft-leach-uuids-guids-01。文本

在此源代码中,您可以看到它是如何构建的,从所有那部分开始,我认为我将使用 TimeStamp + 一个随机数,然后按照我上面的描述再次转换它。

于 2012-05-20T12:06:40.900 回答
1

我认为这篇文章解决了你的问题,也告诉了解决方案。

http://madskristensen.net/post/Generate-unique-strings-and-numbers-in-C.aspx

它取自上面的链接。

每当我们需要生成唯一密钥时都会使用 System.Guid,但它很长。在很多情况下这不是问题,但在它是 URL 的一部分的 Web 场景中,我们需要使用它的字符串表示形式,它有 36 个字符长。它使 URL 混乱,基本上是丑陋的。

在不丢失 GUID 的一些唯一性的情况下不可能缩短它,但是如果我们可以接受 16 个字符的字符串,我们可以取得很大的进步。

我们可以更改标准 GUID 字符串表示:

21726045-e8f7-4b09-abd8-4bcc926e9e28

变成一个较短的字符串:

3c4ebc5f5f2c4edc

以下方法创建较短的字符串,它实际上非常独特。1000 万次迭代不会产生重复。它使用 GUID 的唯一性来创建字符串。

private string GenerateId()
{
 long i = 1;
 foreach (byte b in Guid.NewGuid().ToByteArray())
 {
  i *= ((int)b + 1);
 }
 return string.Format("{0:x}", i - DateTime.Now.Ticks);
}

如果你想要数字而不是字符串,你可以这样做,但你需要最多 19 个字符。以下方法将 GUID 转换为 Int64。

private long GenerateId()
{
 byte[] buffer = Guid.NewGuid().ToByteArray();
 return BitConverter.ToInt64(buffer, 0);
}

标准 GUID 仍然是确保唯一性的最佳方式,即使它不是 100% 唯一的。

于 2012-05-20T12:05:03.387 回答