В настоящее время Java Object#hashCode()
и System#identifyHashCode()
do not обеспечивают возвращение уникальных значений.Уже есть вопросы по этому поводу, и this является примером.
Вы упомянули сообщение об ошибке, в котором говорится, что столкновение произошло , потому что объекты были собраны мусором, итот же адрес памяти используется повторно.Однако изменение того же тестового примера может доказать обратное:
List<Object> allObjs = new ArrayList<>(); // Used to prevent GC
Set<Integer> hashes = new HashSet<Integer>(1024);
int colls = 0;
for (int n = 0; n < 100000; n++)
{
Integer obj = new Integer(88);
allObjs.add(obj); // keep a strong reference to prevent GC
int ihash = System.identityHashCode(obj);
Integer iho = Integer.valueOf(ihash);
if (hashes.contains(iho))
{
System.err.println("System.identityHashCode() collision!");
colls++;
}
else
{
hashes.add(iho);
}
}
System.out.println("created 100000 different objects - "
+ colls
+ " times with the same value for System.identityHashCode()");
System.out.println("Size of all objects is " + allObjs.size());
System.out.println("Size of hashset of hash values is " + hashes.size());
Результат:
System.identityHashCode() collision!
System.identityHashCode() collision!
System.identityHashCode() collision!
created 100000 different objects - 3 times with the same value for System.identityHashCode()
Size of all objects is 100000
Size of hashset of hash values is 99997
В связанном вопросе SO также упоминалось, что в некоторых реализациях JRE скоростьстолкновение значительно уменьшено .Однако кажется, что ни одна реализация не смогла предотвратить все коллизии.Следовательно, нет способа обеспечить уникальность хеш-кодов даже в Java.
Поэтому не стоит просто верить, основываясь на одном источнике.Человек, который комментирует это, также является просто членом команды Oracle, и он или она, скорее всего, не тот, кто разрабатывает это.
В C # и Java вам придется создать свой собственный генератор уникальных чиселкакой-то.Таким образом, решение , предоставленное NPras, похоже, делает это для .NET.