Как конвертировать 2 Guids в строку длиной до 50 символов (2-х стороннее преобразование)
У меня есть интересная проблема - мне нужно преобразовать 2 (случайно) сгенерированных Guids в строку. Вот ограничения:
- длина строки не более 50 символов.
- можно использовать только цифры и строчные буквы (0123456789abcdefghijklmnopqrstuvwxyz)
- алгоритм должен быть двухсторонним - нужно уметь декодировать закодированную строку в те же 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;
}
}