У меня проблема с получением уникального идентификатора int32 со следующими свойствами:
- Он всегда должен быть одинаковым для одних и тех же объектов в текущем экземпляре программы
- Он имеет всегда отличаться в текущем экземпляре программы для разных объектов, поэтому никаких коллизий.
Мне нужен этот уникальный идентификатор для сравнения сложных объектов и работы с такими классами, как Dictionary <> или HashSet <> et c.
Я бы очень хотел избежать использования каких-либо таблиц ha sh или любых предварительных вычислений, а вместо этого иметь алгоритм, который будет делать это на лету, чтобы исключить внешние зависимости и упростить модульное тестирование
Псевдокод объекта:
class ComplexObject
{
public readonly FirstEnum First; // ~50 different values
public readonly IFirstModificator FirstModificator; // 4 implementations x 15 values (~60 values total)
public readonly InternalObject[] Internal; //1-10 values in array
}
class InternalObject
{
public readonly SecondEnum Second; // ~30 different values
public readonly SecondModificator SecondModificator; // ~15 different values
}
Если это важно, моя модель предметной области содержит около 100 000 уникальных объектов типа ComplexObject
Я уже пробовал :
- Сериализация объекта в json и получение ha sh этой строки (с помощью метода string.GetHashCode ()). Он вызывает коллизии даже в текущем экземпляре программы.
- Код, подобный этому, тоже вызывает множество коллизий:
unchecked
{
int hash = 17;
hash = hash * 31 + firstField.GetHashCode();
hash = hash * 31 + secondField.GetHashCode();
return hash;
}
unchecked
{
int hash = (int) 17;
hash = (hash * 31) ^ field1.GetHashCode();
hash = (hash * 31) ^ field2.GetHashCode();
return hash;
}
ОБНОВЛЕНО:
IFirstModificator имеет разные реализации, но в целом это выглядит так:
class FirstModificator : IFirstModificator
{
public int Value {get;set;} //~15 values
}
Другие параметры реализации IFirstModificator влияют \ применяются (не уверен, что мой английский sh ясен) только для обработки данных.
class SecondModificator
{
public int Value {get;set;} //~15 values
}
Внешний интерфейс и данные, необходимые для создания экземпляра класса, аналогичны реализации IFirstModificator, но на самом деле это разные классы.