Guid碰撞C#

时间:2018-05-15 16:57:59

标签: c# guid

最近,我们在现金支付流程中实施了Guid。仅仅十天,我们至少有十几起关于Guid碰撞的案例。 请告知为什么不同位置的不同终端产生相同的guid以及如何避免guid碰撞。

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

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

    public Guid Id { get; set; }        
}

1 个答案:

答案 0 :(得分:1)

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

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

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

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

  1. 正在复制/引用实例,并且副本自然具有相同的功能 Id属性为原始。
  2. 系统中某处的代码正在弄乱Id属性并将其重置为其他内容。
  3. 即使Lack-Of-Encapsulation不是导致此特定问题的原因,我高度建议您将该行更改为:

    public Guid Id { get; private set; }
    

    ......或......

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

    无论如何,正如几个人发布的那样,生成完全重复的GUID几乎是不可能的。所以我怀疑上面发布的内容实际上是导致问题的原因。