我想知道是否有办法生成有效的GUID/UUID,其中第一个(或任何部分)部分是用户选择的前缀.
即,GUID的格式为AAAAAAAA-BBBB-CCCC-DDDD-DDDDDDDDDDD,我想将任何部分设置为预定义值(理想情况下为AAA).目标是使GUID仍然是全局唯一的,但它们不需要加密安全.
抱歉,您对 GUID 的要求太多了。总结您的问题和您自己的答案/更新,您希望它
这是不可能的,证明:如果可能,我可以生成一个 GUID G1,而您可以生成另一个 GUID G2。由于我们都忽略了标准并使用相同的保留前缀,而且我对其他位的个人方案不在您的控制范围内,因此我的 GUID G1 可能与您的 GUID G2 发生冲突。GUID 的非冲突特性源于坚持 GUID 标准。
防止冲突的机制确实本质上是隐私敏感的。如果我随机生成一个 GUID G1,如果满足两个条件,我可以保证随机 GUID 是唯一的:
对于您控制的子集之外的 GUID,您不能保证 (2)。但是如何将不重叠的 GUID 子集分配给一个人呢?使用 NIC 的 MAC 是一种简单有效的方法。其他方式也是可能的。但无论如何,仅存在这样一个子集就涉及隐私。它必须属于某人,我必须能够确定是我还是其他人。证明两个随机 GUID G1 和 G2 是否属于同一个子集(即人)有点困难,但当前的方案(您反对)并没有试图隐藏这一点。
嗯...所以,你基本上喜欢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应该让你到那里.