Я думаю, что вы на 99% пути туда.
Хеширование звучит как правильное решение. Очевидный способ воспользоваться преимуществами особой природы GUID - предоставить собственную хэш-функцию, которая объединяет в одно 32-разрядное целое число 4 32-разрядных целых числа, составляющих GUID. Я бы просто XOR 4 целых числа.
Полагаю, вы используете Generics.Collections.TDictionary. Вы можете предоставить свою собственную хэш-функцию, передав в конструктор пользовательский компаратор. Я не буду беспокоиться о хранении резервных значений, я не думаю, что это заметно повлияет на производительность.
Я верю, что вы храните свои GUID как 128-битные целые, а не как строки.
Наконец, мне пришло в голову, что компаратор по умолчанию для идентификатора GUID действительно может выполнить генерацию хеш-кода таким образом. Это стоит проверить перед внесением каких-либо изменений.
EDIT
Хеш-код по умолчанию использует хэш Боба Дженкинса, примененный к двоичным данным. XOR был бы быстрее, но хэш-код по умолчанию не является узким местом в производительности.
Другими словами, я думаю, что TDictionary<TGUID,Integer>
удовлетворит ваши потребности вполне адекватно.