Я пытаюсь подражать тому, как приложение С# преобразует UUID в значение Base64. По какой-то причине я могу получить часть строки в соответствии с ожидаемым значением, но не всей строкой.
Код С# мне дал:
public static string ToShortGuid(this Guid newGuid) {
string modifiedBase64 = Convert.ToBase64String(newGuid.ToByteArray())
.Replace('+', '-').Replace('/', '_') // avoid invalid URL characters
.Substring(0, 22);
return modifiedBase64;
}
Что я пытался в Python 3.6:
import uuid
import base64
encode_str = = base64.urlsafe_b64encode(uuid.UUID("fa190535-6b00-4452-8ab1-319c73082b60").bytes)
print(encode_str)
"fa190535-6b00-4452-8ab1-319c73082b60" является известным UUID, и приложение, по-видимому, использует вышеуказанный код С# для генерации значения "ShortGuid" "NQUZ-gBrUkSKsTGccwgrYA".
Когда я обрабатываю один и тот же UUID через мой код Python, я получаю: "-hkFNWsARFKKsTGccwgrYA =="
Из обеих этих выходных строк эта часть соответствует: "KsTGccwgrYA", а остальное - нет.
Вам нужно использовать bytes_le
чтобы получить соответствие с Microsoft:
base64.urlsafe_b64encode(uuid.UUID("fa190535-6b00-4452-8ab1-319c73082b60").bytes_le)
Это дает b'NQUZ-gBrUkSKsTGccwgrYA=='
.
NQUZ-gBrUkSKsTGccwgrYA
соответствует байтовой последовательности 350519fa006b52448ab1319c73082b60
.
Если добавить -
в соответствующих местах, мы получим:
350519fa-006b-5244-8ab1-319c73082b60
# \/ \/ \/
# /\ /\ /\
fa190535-6b00-4452-8ab1-319c73082b60
По сравнению с известным UUID, с которого вы начали, байты одинаковы, но порядок в первых трех подгруппах отменен.
Чтобы подражать тому, что делает.NET, вам нужно использовать UUID.bytes_le:
UUID как 16-байтовая строка (с time_low, time_mid и time_hi_version в порядке порядка байтов).
См. Также Почему Guid.ToByteArray() упорядочивает байты так, как он делает?