在开始时为对象提供唯一的ID

时间:2015-06-13 08:20:36

标签: c# .net random unity3d

我有一堆gameObjects,我在Start函数中指定了唯一的id。

void Start() {
    UniqueID = String.Format("{0:X}", DateTime.Now.Ticks);
}

我认为这会有效,但我偶尔会得到重复的ID。我怎样才能确保它们始终是独一无二的?

3 个答案:

答案 0 :(得分:6)

我会使用guid。

UniqueID = Guid.NewGuid.ToString();

使用您的建议,同时运行2个实例,可以将相同的“唯一”UniqueID应用于2个不同的对象。

Guid在各个实例中应该是唯一的。

答案 1 :(得分:3)

此方法不会在应用程序的多个实例中提供唯一ID!

我建议使用static long变量并使用Interlocked.Increment处理并发和同步,以便您可以轻松地将Id分配给对象。它比GUID更好用于调试目的并且更具可读性。它使用的内存少于GUID。

//define an accessible static variable somewhere in your code
public static long __Id = 0;

//use it to assign unique Id to objects
UniqueID = Interlocked.Increment(ref __Id);

它的性能也比GUID好,这里有一个快速检查和结果

public static long __Id = 0;
private static void Main(string[] args)
{
    var sw1 = new Stopwatch();
    var guid = Guid.NewGuid();
    sw1.Start();
    for (var i = 0; i < 10000000; i++)
    {
        guid = Guid.NewGuid();
    }
    sw1.Stop();
    Console.WriteLine(guid);
    Console.WriteLine(sw1.ElapsedTicks);

    var sw2 = new Stopwatch();
    long id = 0;
    sw2.Start();
    for (var i = 0; i < 10000000; i++)
    {
        id = Interlocked.Increment(ref __Id);
    }
    sw2.Stop();
    Console.WriteLine(id);
    Console.WriteLine(sw2.ElapsedTicks);
}

和结果

  

f91419e0-9d3a-4e64-b7fd-ed2080dad599
   10376104 (指导时间)
  千万
   304231 (很长一段时间)比guid快34倍

答案 2 :(得分:1)

Unity已为每个对象实例提供唯一ID,请查看GetInstanceID