GUID,30个字符随机字符串

har*_*ony 8 guid

我需要生成一个长度为30个字符的唯一字符串.首先,我将生成一个GUID,然后删除前两个字符.

Guid.NewGuid().ToString("N").Substring(2);
Run Code Online (Sandbox Code Playgroud)

删除这两个第一个字符会对"唯一性"产生重大影响吗?这是我应该担心的事情吗?

有没有更好的方法来生成一个随机的30个字符串,保证是唯一的?

Mar*_*ers 5

截断GUID会失去唯一性.要了解为什么要了解如何创建GUID.它由几部分组成:

  • 60位时间戳
  • 48位计算机标识符
  • 14位的uniquifier
  • 6位是固定的

通过丢弃前两个字符,您将丢弃时间戳部分的8个最高有效位. 本文解释了它以及截断GUID的危险.它还解释了如何使用GUID中使用的相同技术来创建不是全局唯一的唯一标识符,但对于更具约束力的情况将是唯一的.


Dan*_*ner 5

从GUID中删除两个十六进制字符或等效的8位将使其不那么独特,但120位仍然是一个非常好的唯一值.如果您不希望每秒生成数百万个ID,那么从时间戳和无统一程序中删除一些位应该是安全的,而不会有发生冲突的风险.例如,参见Wikipedia 的GUID结构.

另一种解决方案是在Base64中对GUID进行编码,如果不仅限于十六进制字符,则可以使用类似的方法.在Base64中编码的128位产生一个长度为24的字符串.然后你甚至可以添加另外6个随机字符来将字符串填充到30个字符,使其更加独特.