如何创建不包含数字的唯一标识符?

Sin*_*tic 3 c# guid uniqueidentifier uid

我想在.resx文件中使用某种唯一标识符,但它不允许键以数字开头.在我得到以字母开头的GUID之前,我不想循环访问GUID,而是想知道是否存在替代UID类型,该类型不包含数字或者否则将满足此要求.

有什么想法吗?

p.s*_*w.g 10

如果你只是想创建一个以字母开头的Guid ,你可以这样做:

var b = Guid.NewGuid().ToByteArray();
b[3] |= 0xF0;
return new Guid(b);
Run Code Online (Sandbox Code Playgroud)

这将始终生成以十六进制数字开头的GUID F.

要创建不包含任何数字的Guid,您可以使用以下内容:

return new Guid(Guid.NewGuid().ToByteArray()
    .Select(b => (byte)(((b % 16) < 10 ? 0xA : b) | 
                        (((b >> 4) < 10 ? 0xA : (b >> 4)) << 4)))
    .ToArray());
Run Code Online (Sandbox Code Playgroud)

这将测试每个十六进制数字(每个字节两个)并强制它,A如果它小于A.


上述两种解决方案都会生成真实Guid对象,尽管增加的限制确实会在一定程度上降低结果GUID的唯一性(在第二个示例中更是如此).如果你不关心输出是实际的GUID,你可以简单地将十六进制数字重新映射到其他东西并将结果返回一个字符串,正如其他人所建议的那样.FWIW,这是我能想到的最短的解决方案:

return String.Concat(Guid.NewGuid().ToString("N").Select(c => (char)(c + 17)));
Run Code Online (Sandbox Code Playgroud)

这通过9 0映射十六进制数字的字符A通过J,并且十六进制数字A- F到字符r通过w.它还会生成一个没有连字符的字符串.它例如:

Before: e58d0f329a2f4615b922ecf53dcd090a
After:  vFIuAwDCJrCwEGBFsJCCvtwFDutuAJAr
Run Code Online (Sandbox Code Playgroud)

当然,如果您不喜欢这里的混合大小写,您可以将其转换为所有大写或小写.

  • 你确定它会保证独一无二吗? (2认同)
  • @HamletHakobyan:即使是来自`Guid.NewGuid`的GUID,也没有任何改编,也不能保证是唯一的。可能性非常非常大。 (2认同)
  • @Hamlet:除此之外,它意味着"有限数量".事实是他们不能保证是独一无二的.它们非常接近,几乎可以指出所有情况下的唯一性......但如果您需要绝对确定,则需要跟踪已经使用过的GUID.因为如果重复是生死攸关的事,那么1/2 ^ 122比0大. (2认同)