首页 > 解决方案 > 引导碰撞 C#

问题描述

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

请在我们生成 Guid 的类下面找到

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

    public Guid Id { get; set; }        
}

标签: c#guid

解决方案


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

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

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

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

  1. 正在复制/引用一个实例,副本自然具有与原始相同的 Id 属性。
  2. 系统中某处的代码正在弄乱 Id 属性并将其重置为其他内容。

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

public Guid Id { get; private set; }

... 或者 ...

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

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


推荐阅读