【问题标题】:Assign Incrementing uint ID in constructor in C#在 C# 的构造函数中分配递增的 uint ID
【发布时间】:2021-03-05 17:50:54
【问题描述】:

我有一个类,据说可以处理 uint 类型的唯一 ID 的生成。然而,多次使用后,uint 值似乎并没有增加。

static class UniqueIdGenerator
    {
        public static uint nextUnique;

        public static uint GetNextUnique()
        {
            nextUnique++;
            return nextUnique;
        }
    }

此类用于在其他类上调用它时分配一个唯一的整数 ID。例如下面的两个示例构造函数都有一个 ID 属性,该属性应该从 UniqueIdGenerator 类中获取其值

 public Car()
     {
        carNumber = UniqueIdGenerator.GetNextUnique();
     }

public Boat()
     {
        boatNumber = UniqueIdGenerator.GetNextUnique();
     }

【问题讨论】:

  • 提示:在引用实例成员时始终使用this.,并使用_ 作为静态成员的前缀,或者使用类型名称作为说明符。否则无法从您发布的代码中判断carNumber 是否为static
  • 您应该使用 return Interlocked.Increment( ref staticVar ) 而不是使用 ++ 运算符 - 否则您会遇到并发问题。
  • @Dai 如果有多个线程。如果它是 Web 应用程序,可能会发生。 nextUnique 未初始化为零。

标签: c# unique unique-id id-generation


【解决方案1】:

据我所知,发布的代码应该可以工作。但它确实带来了麻烦。

第一个问题是线程安全。两个线程可以尝试增加相同的值并导致具有相同的 ID。要解决此使用 Interlocked.Increment(ref nextUnique)

第二个潜在问题是安全问题 - 增量 ID 会导致易于抓取的 Web API。如果我没记错的话,Zoom 去年的会议 ID 也有类似的问题。

如果您需要 ID,则使用 GUID 可以解决这两个问题,并且它还有一个额外的好处,那就是不必过多担心 ID 在分布式系统中发生冲突:

public class MyBusinessObject
{
  public Guid ID {get; private set;} = Guid.NewGuid();
}

私有set是开启反序列化,同时禁止在代码中直接设置值。

我意识到这对于您可能认为的一个非常简单的问题来说太过分了,但是忽略隐藏的复杂性可能会导致被黑客入侵。

干杯!

【讨论】:

  • Guid 是相当随机的,在分布式系统中当然很好,但它们并不是为了防止真正的猜测攻击。请参阅例如stackoverflow.com/a/4517620/4626765 了解更多详情。
  • @MikaelSuokas 我的建议是将它们用作 ID,而不是安全令牌。在 Windows 上,它们在当前实现 (v4) 中实际上是随机的,但没有公开声称随机生成器的质量强度。
猜你喜欢
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多