Каковы хорошие методы для замены имен строк на целочисленные хэши - PullRequest
8 голосов
/ 04 января 2012

Обычно сущности и компоненты или другие части игрового кода в управляемом данными дизайне имеют имена, которые проверяются, если вы хотите точно определить, с каким объектом вы имеете дело.

void Player::Interact(Entity *myEntity)
{
    if(myEntity->isNearEnough(this) && myEntity->GetFamilyName() == "guard")
    {
       static_cast<Guard*>(myEntity)->Say("No mention of arrows and knees here");
    }
}

Если вы игнорируете возможность того, что это может быть преждевременной оптимизацией, совершенно очевидно, что поиск сущностей был бы намного быстрее, если бы их «имя» представляло собой простое 32-битное значение вместо реальной строки.

Вычисление хэшейиз имен строк является одним из возможных вариантов.Я на самом деле не пробовал, но с диапазоном 32 бита и хорошей функцией хеширования риск столкновения должен быть минимальным.

Вопрос заключается в следующем: очевидно, нам нужен какой-то способ преобразования имен строк в коде (или в каком-то внешнем файле) в эти целые числа, так как человек, работающий с этими именованными объектами, все равно захочет обратитьсяк объекту как «guard» вместо «0x2315f21a».

Предполагая, что мы используем C ++ и хотим заменить все строки, которые появляются в коде, это может быть даже достигнуто с помощью встроенных в язык функций или сделатьмы должны создать внешний инструмент, который вручную просматривает все файлы и обменивается значениями?

Ответы [ 4 ]

10 голосов
/ 04 января 2012

Джейсон Грегори написал это на своей книге :

В Naughty Dog мы использовали вариант алгоритма CRC-32 для хеширования наших строк, и мы не делали этого.столкнуться с одним столкновением за более чем два года разработки Uncharted: Drake's Fortune.

Так что вы можете захотеть разобраться в этом.говорили об этом.Они в основном инкапсулируют строки, которые должны быть хешированы в нечто вроде:

_ID("string literal")

И используют внешний инструмент во время сборки для хэширования всех вхождений.Таким образом вы избежите любых затрат времени выполнения.

1 голос
/ 04 января 2012

Вот для чего перечисления.Я не осмелился бы решить, какой ресурс лучше для этой темы, но есть из чего выбрать: https://www.google.com/search?q=c%2B%2B+enum

0 голосов
/ 30 января 2012

Это в основном решается добавлением косвенного обращения поверх хеш-карты.

Скажем, вы хотите преобразовать строки в целые числа:

  • Запись класса оборачивает как массив, так ихэш-карта.Я называю эти словари классов.
  • Массив содержит строки.
  • Ключ хэш-карты - это строка (общие указатели или стабильные массивы, где необработанные указатели также безопасны)
  • Значением хеш-карты является индекс в массиве, в котором находится строка, который также является непрозрачным дескриптором, который возвращается к вызывающему коду.
  • При добавлении новой строки в систему выполняется поиск уже существующихв hashmap возвращает дескриптор, если он присутствует.
  • Если дескриптор отсутствует, добавьте строку в массив, индекс будет дескриптором.
  • Установите строку и дескриптор всопоставить и вернуть дескриптор.

Примечания / предостережения:

  • Эта стратегия заставляет возвращать строку из дескриптора в постоянное время (это просто обращение к массиву)).
  • идентификаторы дескриптора в порядке поступления, но если вы сериализуете строки вместо значений, это не будет иметь значения.
  • Оператор [] перегружает оба кеy и значение довольно просты (регистрация новых строк или возврат строки), но перенос дескриптора с помощью пользовательского класса (перенос целого числа) добавляет много необходимой безопасности типов, а также позволяет избежать двусмысленности, если вы хотитеключ и значения должны быть одинакового типа (перегруженные [] не будут компилироваться и т. д.)
  • Вы должны хранить строки в ОЗУ, что может быть проблемой.
0 голосов
/ 04 января 2012

Я бы сказал, идти с перечислениями!

Но если у вас уже есть большой код, уже использующий строки, хорошо, либо просто оставьте его таким (простым и обычно достаточно быстрым на ПК в любом случае) илихэшируйте это с помощью некоторого вида CRC или MD5 в целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...