【问题标题】:Can two guids (keys) be the same? [duplicate]两个向导(键)可以相同吗? [复制]
【发布时间】:2013-09-17 19:41:55
【问题描述】:

我为我的软件生成密钥:

Guid.NewGuid().ToString();

返回类似:15c6bd70-8d3c-42d0-bb24-40da6e08ed9d

无论如何,每当有人购买新软件时,我都会生成一个新密钥。我可以两次生成相同的密钥吗?每次有人购买该软件时,我都会调用该方法:Guid.NewGuid().ToString()我是否应该在每个 guid 的末尾附加一个计数器以 100% 确保不能重复?

编辑

Guid 类的构造函数将 16 字节的字节数组作为参数。如果您序列化当前日期(8 个字节),然后将另外 8 个随机字节附加到 GUID 的构造函数,这将是 100% 安全的吗?我只是根据你的回答要求学习我可能只有Guid.NewGuid()

【问题讨论】:

  • 有可能,但非常不太可能。
  • 除非您打算销售 quintillions 的副本,否则您会没事的。
  • @DmitryBrant:“Quintillions”在计算中足够接近“零”,即使是这么多在统计上也无关紧要。
  • @David 我的意思是说“亿万”
  • Quintillions, zillions, bajillions... 你们正在进入一个语义迷宫。重要的是,两个 GUID 发生冲突的几率比 Valve 发布半条命 3 的几率要小,或者比 Opera 成为市场上最受欢迎的浏览器的几率要小。

标签: c# guid


【解决方案1】:

摘自有史以来关于 Guid 的最佳 blog series 之一:

有许多可能的策略来制作唯一的 GUID,事实上,关于所使用策略的信息被编码在第三个“组”的前四位中;您看到的几乎每个 GUID 都将采用 {xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx} 或 {xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx} 的形式。

如果那个地方有一个,那么用于保证唯一性的算法本质上是 ISBN 策略的一种变体。通过选择一些位作为机器中网卡的 MAC 地址,可以保证 GUID 在“空间”中是唯一的。 (确保世界上没有两个网卡具有相同 MAC 地址的棘手问题由其他人以某种方式解决;该问题如何解决,我们并不特别关心。解决该问题的成本转嫁给您,消费者,在网卡的购买成本中。)

简而言之,它们不太可能发生碰撞。

【讨论】:

  • And using the .NET implementation, you're leveraging the MAC address implementation 不再是了,除非你使用的是相当旧的版本。
  • @Servy,啊,这对我来说是个新闻。我会放弃的。
  • MAC 地址实际上并不是唯一的。它们应该是,但实际上确实发生了碰撞。
  • @Guffa,是的,我认为在我从 Eric 那里摘录的部分中,有一个更新表明即使是 MAC 地址,实际上也存在字面冲突,而且它们当然可以被欺骗。正如您在回答中所说,我想说的是,这几乎是不可能的。
【解决方案2】:

是的,有可能,但极不可能。 GUID 冲突的可能性与 GUID 在内存中自发变化的可能性差不多,而这种事情通常不是您担心的。

你已经可以 100% 确定了,当然,如果你不是说你需要 100.0000000000000000000000000000000000000% 确定的话。

【讨论】:

  • "The probability for a GUID collision is about as likely as a bit in the GUID changing spontaneously in memory" - 我想我要查找相关的统计信息,以便在向客户解释 GUID 时使用它。我敢打赌,它甚至比位变化更不可能,可能是数量级,这是一个很好的比较。
  • +1 用于实际计算正确数量的零,以获得 100% 的精度。
【解决方案3】:

只需使用 Guid.. 无需附加任何内容。除非您希望卖出的副本数量超过宇宙中的原子数量(不太可能)。

【讨论】:

猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
相关资源
最近更新 更多