Кодирование строки из 5 символов в уникальное и повторяемое 32-битное целое число - PullRequest
3 голосов
/ 13 сентября 2010

Я еще не слишком много думал об этом, поэтому я могу оказаться глупым вопросом.

Как я могу взять уникальную 5-символьную строку ASCII и преобразовать в уникальную и воспроизводимую (т.е. должна быть одинаковую каждый раз) 32-битную целую?

Ответы [ 6 ]

3 голосов
/ 13 сентября 2010

Если все пять символов будут принадлежать к набору из 84 или менее отдельных символов, то вы можете втиснуть пять из них в длинное слово.Конвертировать каждый символ в значение 0..83, затем

  intvalue = ((((char4*84+char1)*83+char2)*82+char3)*81+char0)
  char0 = intvalue % 84
  char1 = (intvalue / 84) % 84;
  char2 = (intvalue / (84*84)) % 84;
  char3 = (intvalue / (84*84L*84)) % 84;  
  char4 = (intvalue / (84*84L*84*84L) % 84;

Кстати, интересно, кто-нибудь использует кодировку base-84 в качестве стандарта;на многих платформах это было бы легче обрабатывать, чем base-64, и результаты были бы более компактными.

3 голосов
/ 13 сентября 2010

Предполагая, что на самом деле это ASCII (т.е. нет символов с порядковыми значениями больше 127), у вас есть пять символов из 7 бит или 35 бит информации. Невозможно сгенерировать 32-битный код из 35 битов, который гарантированно будет уникальным; вам не хватает трех битов, поэтому каждый код будет также представлять 7 других допустимых строк ASCII. Однако очень маловероятно, что вы когда-либо увидите коллизию, если будете осторожны в том, как вы будете вычислять код, чтобы очень похожие входные строки имели совершенно разные коды. Я вижу, другой ответ предложил CRC-32. Вы также можете использовать хеш-функцию, такую ​​как MD5 или SHA-1, и использовать только первые 32 бита; это, вероятно, лучше, потому что хеш-функции специально разработаны для этой цели.

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

3 голосов
/ 13 сентября 2010

Если они гарантированно только для буквенно-цифровых символов, и без учета регистра ([AZ] [0-9]), вы можете рассматривать его как число с базовым номером 36.

2 голосов
/ 13 сентября 2010

Одним из способов является обработка 5 символов как цифр в базе N, где N - количество символов в вашем алфавите (набор разрешенных символов). С этого момента это просто базовое преобразование.

Учитывая, что у вас есть 32 доступных бита и 5 символов для хранения, это означает, что в вашем алфавите может быть 32 ^ (1/5) = 84 символа. Предполагая, что вы включаете только базовый ASCII, а не расширенный ASCII (> 127), у вас есть 7 бит информации в одном символе, так что это немного проблема - слишком много возможностей для создания уникальных значений для каждой строки. Однако первые 32 символа, а также последний символ являются управляющими символами, и если вы их исключите, вы получите до 95 символов.

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

2 голосов
/ 13 сентября 2010

ASCII идет от 0-255, что занимает 8 бит ... В 32 битах у вас есть 4 из них, а не 5. Итак, чтобы сделать его коротким и приятным, вы не можете сделать это.

Даже если вы готовы игнорировать старшие (значения 128-255) ascii (используйте только символы ascii 0-127) и просто используете 7 бит на символ, у вас по-прежнему не более 3 бит (7 * 5 = 35у вас есть только 32 доступных.

2 голосов
/ 13 сентября 2010

Если вам нужно обработать расширенный ASCII, вам не повезло, так как вам потребуется 5 полных символов, что составляет 40 битов.Даже с нерасширенными символами (верхний бит не используется) вам все равно не повезло, поскольку вы пытаетесь кодировать 35 бит данных ASCII в 32 бита целого числа.

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