Использование UInt64 вместо строки (или любого другого ссылочного типа) в качестве ключа для словаря будет практически занимать меньше памяти.Использование ссылочного типа, такого как строка, требует, чтобы словарь сохранял ссылку на ключ во внутренней структуре данных, что приведет к тому, что ссылочный объект (строка) будет также сохраняться в памяти, включая накладные расходы для каждого объекта и т. Д.является UInt64, словарь (текущая реализация) хранит значение ключа вместо ссылки на ключ (как часть обычного способа работы обобщений) без каких-либо отдельных ключевых объектов.
Есть толькоЯ могу вспомнить одну ситуацию, когда ключ UInt64 может вызывать более высокое использование памяти, чем строка: если процесс 32-битный (x86), ссылки 32-битные.Если словарь большой, но почти пустой, будет много пустых Dictionary<K,V>.Entry
экземпляров.Для ключей UInt64 ключевая часть этих экземпляров будет 64-битной (даже если явное значение не назначено), а для строковых ключей - только 32-битная.Таким образом, общий объем выделенной памяти будет больше для словаря с ключами UInt64.Но это очень теоретическая ситуация.
Так что, если вы можете использовать ключи UInt64 вместо строк , не жертвуя другими качествами вашего программного дизайна , нет ничего плохого в их использовании.Но не начинайте оптимизировать, пока это действительно не нужно.Чтобы сказать это словами Дональда Кнута: «преждевременная оптимизация - корень зла»
Если вы просто получили бы строковый ключ, вызвав ToString для значения UInt64, вы должны сначала перейти на версию UInt64.Это будет более эффективным во всех отношениях.
Использование хеша в качестве ключа может быть несколько сложным.Вы должны убедиться, что хэши не сталкиваются.Ваша хеш-функция на первый взгляд не выглядит особенно хорошо, но это, конечно, зависит от вашего варианта использования.Но это выходит за рамки этого вопроса, я полагаю.