Стабильный хэш для сериализации кроссплатформенных типовC#

Место общения программистов C#
Ответить
Anonymous
 Стабильный хэш для сериализации кроссплатформенных типов

Сообщение Anonymous »

Я написал библиотеку сериализации на C# и в настоящее время очень агрессивно храню все типы всех объектов, но планирую сделать ее менее агрессивной и сохранять только тогда, когда она нам действительно нужна.Мне интересно, можно ли сократить стоимость хранимого типа до одного целого числа, используя стабильный хэш полного имени типа и имени сборки?
Что-то вроде это:

Код: Выделить всё

int GetStableHash(string input);

int GetOrRegisterType(Type type)
{
return TypeToId.GetOrAdd(type, t => {
int id = GetStableHash(t.AssemblyQualifiedName ?? t.FullName);
// Handle collisions
while (IdToType.ContainsKey(id++))
{
if (IdToType.TryAdd(id, t))
break;
}
return id ;
});
}

Type? GetTypeById(int id)
{
return IdToType.TryGetValue(id, out Type? type) ? type : null;
}
Тогда я могу просто сохранить Int вместо полной строки.
Для регистрации я планировал отсортировать все сборки и типы в алфавитно-цифровом порядке, чтобы в случае коллизии, надеюсь, их идентификаторы будут определены таким же образом. Это не гарантирует детерминированности, но должно быть чертовски близко к этому.
Хотя я проверил это, и оно работает локально, меня беспокоит, будет ли оно будет надежным методом между платформами и проектами. Я понимаю, что коллизии вызывают беспокойство, но меня больше беспокоит, что есть крайний случай, о котором я не подумал, который может сделать идентификаторы ненадежными для таких вещей, как работа в сети или совместное использование сериализованных файлов.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ialization
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»