Как преобразовать 2 направляющих в строку длиной не более 50 символов (2-стороннее преобразование) - PullRequest
6 голосов
/ 17 марта 2012

есть интересная проблема - мне нужно преобразовать 2 (случайно) сгенерированных Guids в строку.Вот ограничения:

  1. длина строки не более 50 символов.
  2. могут использоваться только цифры и строчные буквы (0123456789abcdefghijklmnopqrstuvwxyz)
  3. алгоритм должен быть двухсторонним- необходимо иметь возможность декодировать закодированную строку в те же 2 отдельные направляющие.

Я много раз просматривал поиски преобразования toBase36, но пока с Guid не повезло.

Любойидеи?(С #)

1 Ответ

9 голосов
/ 17 марта 2012

Прежде всего, вам повезло, 36 ^ 50 составляет около 2 ^ 258,5, поэтому вы можете хранить информацию в 50-байтовой строке base-36.Интересно, однако, почему кто-то должен использовать base-36 для этого.

Вам нужно обрабатывать каждый GUID как 128-битное число, а затем объединить их в 256-битное число, которое вы затемпреобразовать в «число» базы-36.Обратное преобразование делает то же самое в обратном порядке.

Guid.ToByteArray преобразует GUID в 16-байтовый массив.Сделайте это для обоих идентификаторов GUID, и вы получите массив из 32 байтов (что составляет 256 бит).Построить BigInt из этого массива (есть конструктор), а затем просто преобразовать это число в base-36.

Чтобы преобразовать число в base-36, сделайте что-то вроде этого (я предполагаю, что все положительно)

const string digits = "0123456789abcdefghijklmnopqrstuvwxyz";

string ConvertToBase36(BigInt number)
{
    string result = "";
    while(number > 0)
    {
        char digit = string[number % 36];
        result += digit;
        number /= 36;
    }
}
...