Есть ли способ получить уникальный идентификатор экземпляра?
GetHashCode()
то же самое для двух ссылок, указывающих на один и тот же экземпляр. Однако два разных экземпляра могут (довольно легко) получить один и тот же хэш-код:
Hashtable hashCodesSeen = new Hashtable();
LinkedList<object> l = new LinkedList<object>();
int n = 0;
while (true)
{
object o = new object();
// Remember objects so that they don't get collected.
// This does not make any difference though :(
l.AddFirst(o);
int hashCode = o.GetHashCode();
n++;
if (hashCodesSeen.ContainsKey(hashCode))
{
// Same hashCode seen twice for DIFFERENT objects (n is as low as 5322).
Console.WriteLine("Hashcode seen twice: " + n + " (" + hashCode + ")");
break;
}
hashCodesSeen.Add(hashCode, null);
}
Я пишу аддон для отладки, и мне нужно получить какой-то идентификатор для ссылки, которая уникальна во время запуска программы.
Мне уже удалось получить внутренний АДРЕС экземпляра, который уникален, пока сборщик мусора (GC) не уплотняет кучу (= перемещает объекты = меняет адреса).
Stack вопрос с переполнением Возможно, была связана с реализацией по умолчанию для Object.GetHashCode().
Объекты не находятся под моим контролем, поскольку я обращаюсь к объектам в отлаживаемой программе с использованием API отладчика. Если бы я контролировал объекты, добавление моих собственных уникальных идентификаторов было бы тривиальным.
Мне нужен уникальный идентификатор для создания объекта hashtable ID → , чтобы иметь возможность искать уже увиденные объекты. Пока я решил это так:
Build a hashtable: 'hashCode' -> (list of objects with hash code == 'hashCode')
Find if object seen(o) {
candidates = hashtable[o.GetHashCode()] // Objects with the same hashCode.
If no candidates, the object is new
If some candidates, compare their addresses to o.Address
If no address is equal (the hash code was just a coincidence) -> o is new
If some address equal, o already seen
}