【问题标题】:Using substring of a GUID for ID, all GUIDs generated on same machine with Asp.NET使用 ID 的 GUID 的子字符串,使用 Asp.NET 在同一台机器上生成的所有 GUID
【发布时间】:2012-05-27 05:38:26
【问题描述】:

我已经阅读了similar questionRaymond Chan's blog post,但对于使用缩短的 GUID 作为 id 仍有疑问。我知道 GUID 是唯一的,但 GUID 的子字符串不是。

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

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

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

【问题讨论】:

  • 附带说明,您的客户可能会遇到税务机关或客户的麻烦,因为国际会计规则要求在给定的一年内,每张发票/订单的编号都高于前一张,或者至少部分数字以这种方式递增(2001-001、2001-002 有效)。 Guids、哈希、随机数不适合这张图片。

标签: asp.net guid uniqueidentifier


【解决方案1】:

您仍然可以使用自动递增的 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 并仍然搜索 find 你可以切断的东西,这里是它的源代码:http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt

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

【讨论】:

    【解决方案2】:

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

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

    取自以上链接。

    当我们需要生成唯一密钥时使用 System.Guid,但是 它很长。在很多情况下这不是问题,但在网络中 它是我们需要使用它的字符串的 URL 的一部分的场景 表示长度为 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% 独一无二的。

    【讨论】:

    • 即使它看起来是一个不错的解决方案,但实际上它在这里所做的只是简单地生成一个随机数(代码i *= ((int)b + 1);),这实际上与Random() 的相同功能并不相同并开始为向导播种。如果你看到随机数的源代码是一样的。所以我认为不能保证数字是唯一的!
    • @Aristos :在这里我只是向提问者展示一些选项。他可以根据自己的要求改变这些。就唯一性而言,请阅读我回答的最后一行。
    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 2014-11-27
    • 2010-10-29
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多