Из комментария:
Мне бы хотелось что-то вроде GUID на основе содержимого объектов. Я не против, если есть случайный дубликат каждые 10 триллионов триллионов лет или около того
Это кажется необычным требованием, но так как это ваше требование, давайте посчитаем.
Предположим, вы создаете миллиард уникальных объектов в год - тридцать в секунду - за 10 триллионов триллионов лет. Это 10 49 уникальных объектов, которые вы создаете. Выработать математику довольно легко; вероятность, по крайней мере, одного коллизии хэша за это время выше единицы в 10 18 , когда размер бит хэша меньше 384.
Поэтому вам понадобится как минимум 384-битный хеш-код, чтобы иметь требуемый уровень уникальности. Это удобный размер, равный 12 int32s. Если вы собираетесь создавать более 30 объектов в секунду или хотите, чтобы вероятность была меньше единицы в 10 18 , тогда потребуется больше битов.
Почему у вас такие строгие требования?
Вот что я бы сделал, если бы у меня были ваши заявленные требования. Первая проблема заключается в преобразовании всех возможных данных в самоописывающуюся последовательность битов. Если у вас уже есть формат сериализации, используйте его. Если нет, придумайте тот, который может сериализовать все возможные объекты, которые вас интересуют в хешировании.
Затем, чтобы хэшировать объект, сериализовать его в байтовый массив, а затем запустить байтовый массив с помощью алгоритма хеширования SHA-384 или SHA-512. Это создаст хеш-код профессионального уровня 384 или 512 бит, который считается уникальным даже перед лицом атакующих, пытающихся вызвать столкновения. Этого количества бит должно быть более чем достаточно, чтобы обеспечить низкую вероятность столкновения на вашем таймфрейме в десять триллионов триллионов лет.