我需要生成一个长度为30个字符的唯一字符串。首先,我将生成一个GUID,然后删除前两个字符。
Guid.NewGuid().ToString("N").Substring(2);
删除前两个字符会对“唯一性”产生重大影响吗?这是我应该担心的事情吗?
有没有更好的方法来生成一个随机的30个字符串,该字符串将保证是唯一的?
答案 0 :(得分:5)
截断GUID会失去唯一性。要了解为什么要了解如何创建GUID。它由几部分组成:
通过丢弃前两个字符,您将丢弃时间戳部分的8个最高有效位。 This article解释了这一点以及截断GUID的危险。它还解释了如何使用GUID中使用的相同技术来创建不是全局唯一的唯一标识符,但对于更多受限制的情况将是唯一的。
答案 1 :(得分:5)
从GUID中删除两个十六进制字符或等效的8位将使其不那么独特,但120位仍然是一个非常好的唯一值。如果您不希望每秒生成数百万个ID,那么从时间戳和无统一程序中删除一些位而不会发生冲突可能是安全的。例如,参见structure of GUIDs的维基百科。
如果您不仅限制为十六进制字符,那么另一种解决方案是在Base64中对GUID进行编码或类似的操作。在Base64中编码的128位产生一个长度为24的字符串。然后你甚至可以添加另外6个随机字符来将字符串填充到30个字符,使其更加独特。
答案 2 :(得分:1)
正如其他回答者在我之前所说,如果您只是从GUID中删除两个字符,那么它将不再是唯一的。
但还有另一种方法:可以将GUID缩短到最多20个字符而不会丢失ASCII编码的信息或唯一性。
查看Jeff Atwood撰写的这篇博客文章:
Coding Horror: Equipping our ASCII Armor