我有一堆gameObjects,我在Start函数中指定了唯一的id。
void Start() {
UniqueID = String.Format("{0:X}", DateTime.Now.Ticks);
}
我认为这会有效,但我偶尔会得到重复的ID。我怎样才能确保它们始终是独一无二的?
答案 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。