Как конвертировать 2 Guids в строку длиной до 50 символов (2-х стороннее преобразование)

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

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

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

Есть идеи? (С #)

1 ответ

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

Вы должны рассматривать каждый GUID как 128-битное число, а затем объединить их в 256-битное число, которое затем преобразуете в "число" base-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;
    }
}
Другие вопросы по тегам