Преобразуйте GUID в более короткую строку, используя 36-символьный алфавит от 0 до 9 и от A до Z.

У меня есть приложение, в котором я использую печатные коды qr для идентификации реальных объектов с их записями в базе данных.

База данных использует идентификаторы GUID в качестве первичных ключей (это не подлежит обсуждению, поскольку это периодически подключаемая система).

Чтобы сделать код qr как можно меньше, я пытаюсь преобразовать свой 32-символьный шестнадцатеричный GUID в более короткую строку, которая использует 36-символьный алфавит (0–9 и AZ), доступный в буквенно-цифровых кодах qr.

Вся базовая конверсия проходит через мою голову, поэтому любая помощь очень ценится.


person Andy    schedule 18.01.2011    source источник


Ответы (4)


Вы можете сохранить GUID в виде массива байтов и преобразовать его в Base32.

Также см. этот связанный вопрос.

person sharptooth    schedule 18.01.2011
comment
Он хочет сделать строку короче. Методы, обсуждаемые по этим ссылкам, удлиняют строку. - person Oscar; 12.02.2013
comment
@Oscar: вам не нужно обрабатывать GUID как строку, вы можете обрабатывать его как последовательность байтов, чтобы она составляла 16 байтов, а затем преобразовать ее в Base32 и по-прежнему иметь меньше символов, чем при шестнадцатеричном представлении. - person sharptooth; 12.02.2013

Я бы преобразовал его в Base64, который примерно на 20% меньше, чем Base32. Библиотеки или примеры кода для преобразования в base64 легко доступны. Единственная проблема с base64, очевидно, заключается в том, что буквы «a» и «A» различаются в зависимости от base64, но не обязательно для вашей БД, поэтому, если вы выберете Base64 вместо Base32, вам придется проверить, что сортировка вашей таблицы БД настроить правильно.

person Hannes de Jager    schedule 18.01.2011
comment
Base64 кажется очень простым преобразованием (поскольку Microsoft поместила его в класс Convert), к сожалению, я застрял с алфавитом кода qr, который охватывает только символы 0–9 и AZ. Спасибо - person Andy; 20.01.2011

Значение глобального уникального идентификатора (GUID) может быть представлено в виде 32-символьной шестнадцатеричной строки, но обычно хранится в виде 128-битного (16-байтового) целого числа.

Я подозреваю, что наименьший возможный QR-код, который может хранить такие 128-битные значения, - это указать «Двоичное/байтовое кодирование» (которое может хранить любые 8-битные байты) и хранить 16 байтов напрямую. Это кодирует 1 пиксель на бит, 8 пикселей на байт (плюс стандартные служебные биты). Я почти уверен, что все другие допустимые кодировки QR будут использовать минимум 1 пиксель на бит и будут иметь такие же стандартные накладные расходы. Таким образом, вы не получите QR-код меньшего размера с любым преобразованием Base64, Base45, Base36 или Base32.

Большинство QR-кодов, которые я когда-либо видел, которые кодируют URL-адреса, используют ту же «двоичную/байтовую кодировку» для поддержки строчных букв. QR-коды, использующие «буквенно-цифровое кодирование», по моему опыту, менее распространены — когда они используются для кодирования URL-адресов, они декодируются в URL-адреса, набранные полностью в верхнем регистре (поскольку они могут хранить только 45 символов 0–9, A–Z [только верхний регистр ], пробел, $, %, *, +, -, ., /, :). «11 бит на 2 символа» довольно умны во многих ситуациях, но на самом деле это не помогает при кодировании GUID.

Вы видели http://www.younoodle.com/startups/barcode_guid или Википедия:spime ?

person David Cary    schedule 27.04.2012

Сохранение GUID в QR-коде в виде 16-байтового целого числа — лучший способ получить небольшой QR-код. Если вы обнаружите, что физически он все еще слишком велик, рассмотрите возможность рендеринга Micro QR-кодов. [https://www.qrcode.com/en/codes/microqr.html] (QR-коды не могут быть дополнительно сжаты, так как они уже близки к максимальной энтропии)

person Shrimpy    schedule 14.09.2019