0

我有一个类,据说可以处理 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();
     }
4

1 回答 1

0

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

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

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

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

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

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

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

干杯!

于 2021-03-05T18:17:46.383 回答