使用set Prefix创建GUID

Mic*_*tum 2 c# guid

我想知道是否有办法生成有效的GUID/UUID,其中第一个(或任何部分)部分是用户选择的前缀.

即,GUID的格式为AAAAAAAA-BBBB-CCCC-DDDD-DDDDDDDDDDD,我想将任何部分设置为预定义值(理想情况下为AAA).目标是使GUID仍然是全局唯一的,但它们不需要加密安全.

MSa*_*ers 5

抱歉,您对 GUID 的要求太多了。总结您的问题和您自己的答案/更新,您希望它

  • 1 是一个 GUID
  • 2 不与任何其他 GUID 冲突(全局唯一)
  • 3 忽略第一位解释的标准,使用保留值
  • 4 对其余位使用个人方案

这是不可能的,证明:如果可能,我可以生成一个 GUID G1,而您可以生成另一个 GUID G2。由于我们都忽略了标准并使用相同的保留前缀,而且我对其他位的个人方案不在您的控制范围内,因此我的 GUID G1 可能与您的 GUID G2 发生冲突。GUID 的非冲突特性源于坚持 GUID 标准。

防止冲突的机制确实本质上是隐私敏感的。如果我随机生成一个 GUID G1,如果满足两个条件,我可以保证随机 GUID 是唯一的:

  • 1 它是我控制的 GUID 子集的成员,并且
  • 2 我之前没有生成 GUID。

对于您控制的子集之外的 GUID,您不能保证 (2)。但是如何将不重叠的 GUID 子集分配给一个人呢?使用 NIC 的 MAC 是一种简单有效的方法。其他方式也是可能的。但无论如何,仅存在这样一个子集就涉及隐私。它必须属于某人,我必须能够确定是我还是其他人。证明两个随机 GUID G1 和 G2 是否属于同一个子集(即人)有点困难,但当前的方案(您反对)并没有试图隐藏这一点。


Mar*_*ett 5

嗯...所以,你基本上喜欢12字节的GUID?因为,一旦你删除前4个字节(你的AAA)的唯一性,你就破坏了现有的算法 - 你需要提出自己的算法.

根据相关的RFC,GUID格式分解为:

  UUID                   = time-low "-" time-mid "-"
                           time-high-and-version "-"
                           clock-seq-and-reserved
                           clock-seq-low "-" node
  time-low               = 4hexOctet
  time-mid               = 2hexOctet
  time-high-and-version  = 2hexOctet
  clock-seq-and-reserved = hexOctet
  clock-seq-low          = hexOctet
  node                   = 6hexOctet
  hexOctet               = hexDigit hexDigit
  hexDigit =
        "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
        "a" / "b" / "c" / "d" / "e" / "f" /
        "A" / "B" / "C" / "D" / "E" / "F"
Run Code Online (Sandbox Code Playgroud)

其中唯一的静态数据是版本(4位)和保留/变量(2-3位).我没有看到他们允许任何"用户指定"版本,但是如果您使用1111作为您的版本标识符,我会说在可预见的将来您将是安全的.现有版本在4.1.3节中,但到目前为止只定义了5个版本......在碰撞之前会给你11个更新版本.

所以,如果你可以使用6或7位的清晰度,Guid.NewGuid().ToByteArray()的组合,并在你的位摆弄后创建一个新的Guid应该让你到那里.