Guid 碰撞 C#

Guid Collision C#

最近,我们在现金支付流程中实施了 Guid。短短十天时间,Guid碰撞案例起码有十几起。 请告知为什么不同位置的不同终端生成相同的 guid 以及如何避免 guid 冲突。

请在下面找到我们正在生成 Guid

的 class
public class Cash
{
    public Cash() 
    {
         Id = Guid.NewGuid();
    }

    public Guid Id { get; set; }        
}

不确定这是否是实际问题,但它与我一直在准备的公司内部的技术讲座相吻合。这是您的代码:

public class Cash
{
    public Cash() 
    {
        Id = Guid.NewGuid();
    }
    public Guid Id { get; set; }
}

...这个 class 有一个根本问题:它没有封装。简而言之,'Id' 属性 有一个 public setter - 这意味着任何使用 'Cash' class 实例的代码都可以操纵它编号 属性.

所以我的猜测是以下两个之一:

  1. 一个实例正在copied/referenced,副本自然也一样 id 属性 为原来的。
  2. 系统中某处的代码弄乱了 Id 属性 并将其重置为其他内容。

即使缺少封装不是导致此特定问题的原因,我强烈建议您将该行更改为:

public Guid Id { get; private set; }

...或...

private Guid id;
public Id { get { return this.id } }

无论如何,正如一些人发布的那样,几乎不可能生成完全重复的 GUID。所以我怀疑像我上面发布的那样的东西才是真正导致问题的原因。