Я использую GameKit для работы в сети в своем приложении C ++ (создал класс Objective-C для управления сетью GameKit), но проблема в том, что GameKit использует NSString (не тип C ++) для идентификации пиров (peerID). Я много тестировал GameKit, и в моей практике peerID это всегда число (например, 754569949). Безопасно ли лексически приводить peerID к uint32_t? Есть ли случаи, когда peerID не является числом?
Я вижу пару частей на ваш вопрос: 1) парсинг int от peerID
строка; 2) поддержание связи между вашими внутренними идентификаторами и peerID
s.
Если вам нужно получить peerID
в ваш код C ++, а затем сможете преобразовать его обратно в NSString
для использования с каркасом GameKit, вы не должны делать больше предположений о peerID
содержание, чем официальные документы предоставляют.
Другими словами, если вам абсолютно необходимо использовать целые, укажите способ отображения peerID
с вашими внутренними идентификаторами. Но продолжай peerID
вокруг и связаны с вашими идентификаторами, чтобы иметь возможность отображать другой путь — от вашего идентификатора обратно NSString
,
Составление карты NSString -> uint32_t
может быть один из способов сделать это.
Вышесказанное в основном охватывает вторую часть, о которой я упоминал в первом предложении. Теперь давайте посмотрим, если это сохранить для анализа peerID
как целое число
Если вам нужно гарантировать, что конкретный peerID
всегда будет отображаться на то же uint32_t
Считаете peerID
представляет собой число, которое всегда будет вписываться в uint32_t
или вы вычисляете хеш строки. Есть проблемы с обоими подходами. Такой короткий хэш может иметь коллизии в реальном использовании. С другой стороны, ваша система может однажды затормозить, когда Apple решит продлить peerID
s также включать буквы.
Поэтому я не могу принять решение за вас, я просто попытался изложить возможности, которые вы могли бы рассмотреть. Я настоятельно рекомендую вам найти способ использовать оригинальные peerID
, возможно преобразованный в строковый тип C ++.
Проблема в том, что для совместимости с другими частями кода мне нужно идентифицировать клиентов по целому, а не по строке
Если вам нужно получить целое число из этих строк, при отсутствии какой-либо гарантии это всегда будет число, просто создайте таблицу известных идентификаторов и присвойте им индексы.
57483829 => 0
42937422 => 1
3333fghh => 2
Вы могли бы использовать два std::map
s для быстрого преобразования между двумя представлениями.
Просто конвертируйте NSString
к строке, которая является более дружественной к C ++. В качестве альтернативы, сначала выполните перевод и поддерживайте индексы в Objective-C, и вы можете дать своему коду C ++ индекс.