2016-03-14 3 views
1

У меня есть строки, которые находятся в формате (0-9) (A-Z) (A-Z) (A-Z) (A-Z), например. 0AAAA или 7ZHSK и т. Д.Строка к уникальной десятичной форме

Я хочу независимый от платформы способ преобразования этого в уникальное десятичное число.

Я пробовал crc32, который очень близок к тому, что я хочу, и я проверил, что нет никаких столкновений со всеми возможными комбинациями 4569,760.

Моя проблема crc32 выводит другой результат на 32-битной машине и 64-битной машине,

Есть ли что-нибудь подобное, что будет так, что работу? Мне нужно использовать стандартные функции, которые будут доступны на нескольких языках, поэтому никаких пользовательских функций.

Edit: Вот пример кода для запуска в этих двух местах:

echo crc32('1AAAA'); 

http://www.writephponline.com

output = -534072890 

http://phptester.net

output = 3760894406 
+0

Какая реализация CRC это? Разумеется, CRC имеет смысл, если он ведет себя одинаково на всех платформах. – biziclop

+0

@biziclop Я заметил это при использовании PHP в разных системах – Craig

+1

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

ответ

3

Почему бы просто не использовать топоним значение семантика? В результате требуется только 23 бита, поэтому он прекрасно вписывается в стандартный интегральный тип: (. Это предполагает, что ваша строка кодирование содержит все заглавную букву символы в непрерывной последовательности, например, как UTF-8)

#include <cinttypes> 
#include <string> 

std::uint32_t to_int(std::string const & s) 
{ 
    return 
     (s[4] - 'A') * 1 + 
     (s[3] - 'A') * 26 + 
     (s[2] - 'A') * 26*26 + 
     (s[1] - 'A') * 26*26*26 + 
     (s[0] - '0') * 26*26*26*26; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^