我有一堆游戏对象在Start函数中,我正在为它们分配唯一的id。
void Start() {
UniqueID = String.Format("{0:X}", DateTime.Now.Ticks);
}
我认为这个方法是可行的,但有时候我会得到重复的ID。如何确保它们总是唯一的?
我有一堆游戏对象在Start函数中,我正在为它们分配唯一的id。
void Start() {
UniqueID = String.Format("{0:X}", DateTime.Now.Ticks);
}
我会使用GUID。
UniqueID = Guid.NewGuid.ToString();
使用您的建议,在同一时间运行的 2 个实例中,可能将相同的“唯一” UniqueID 应用于 2 个不同的对象。
即使跨实例,Guid 也应该是唯一的。
DateTime.Now
使用的内部时钟已经“滴答”地运行。我建议你尝试编写一个示例程序,在循环中输出 DateTime.Now.Ticks
,你可能会惊讶于在下一个不同值出现之前你会得到多少个相同的值。 - Jon Skeet该方法无法为您的应用程序的多个实例提供唯一的Id!
我建议使用一个static long
变量,并使用Interlocked.Increment来处理并发和同步,以便轻松地为您的对象分配Id。相比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 (全局唯一标识符时间)
10000000
304231 (长整型时间) 比全局唯一标识符快34倍
Unity
已经为每个对象实例提供了唯一的ID,可以查看GetInstanceID。