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 实例的代码都可以操纵它编号 属性.
所以我的猜测是以下两个之一:
- 一个实例正在copied/referenced,副本自然也一样
id 属性 为原来的。
- 系统中某处的代码弄乱了 Id 属性 并将其重置为其他内容。
即使缺少封装不是导致此特定问题的原因,我强烈建议您将该行更改为:
public Guid Id { get; private set; }
...或...
private Guid id;
public Id { get { return this.id } }
无论如何,正如一些人发布的那样,几乎不可能生成完全重复的 GUID。所以我怀疑像我上面发布的那样的东西才是真正导致问题的原因。
最近,我们在现金支付流程中实施了 Guid。短短十天时间,Guid碰撞案例起码有十几起。 请告知为什么不同位置的不同终端生成相同的 guid 以及如何避免 guid 冲突。
请在下面找到我们正在生成 Guid
的 classpublic 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 实例的代码都可以操纵它编号 属性.
所以我的猜测是以下两个之一:
- 一个实例正在copied/referenced,副本自然也一样 id 属性 为原来的。
- 系统中某处的代码弄乱了 Id 属性 并将其重置为其他内容。
即使缺少封装不是导致此特定问题的原因,我强烈建议您将该行更改为:
public Guid Id { get; private set; }
...或...
private Guid id;
public Id { get { return this.id } }
无论如何,正如一些人发布的那样,几乎不可能生成完全重复的 GUID。所以我怀疑像我上面发布的那样的东西才是真正导致问题的原因。