模拟将UUID编码为Base64

时间:2018-06-30 11:59:06

标签: python .net uuid

我正在尝试模拟C#应用程序将UUID转换为Base64值的方式。出于某种原因,我可以得到部分字符串以匹配期望值,而不是整个字符串。

为我提供的C#代码:

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,该应用程序显然使用上述c#代码来生成“ ShortGuid”值“ NQUZ-gBrUkSKsTGccwgrYA”。

当我通过Python代码处理相同的UUID时,我得到:“ -hkFNWsARFKKsTGccwgrYA ==”

在这两个输出字符串中,此部分都匹配:“ KsTGccwgrYA”,但其余部分不匹配。

2 个答案:

答案 0 :(得分:6)

ul { list-style: none; padding: 0; margin: 0; height: 100%; } ul li { display: inline-block; padding: 15px; } ul li ul li{ margin: 0; padding: 0; display: none; } ul li:hover ul li{ display: block; }对应于<body> <header> Html5 begins </header> <nav> <ul> <li><a href="#">div</a> <ul> <li>Link1.1</li> <li>Link1.2</li> <li>Link1.3</li> </ul> </li> <li><a href="#">head</a> <ul> <li>Link2.1</li> <li>Link2.2</li> <li>Link2.3</li> </ul> </ul> </nav> </body>的字节序列。

如果在适当的位置添加NQUZ-gBrUkSKsTGccwgrYA,则会得到:

350519fa006b52448ab1319c73082b60

与开始时使用的已知UUID相比,字节相同,但是前3个子组中的顺序相反。

要模拟.NET的功能,您需要使用UUID.bytes_le

  

UUID为16字节的字符串(以小尾数字节顺序(带有 time_low time_mid time_hi_version )。

另请参阅Why does Guid.ToByteArray() order the bytes the way it does?

答案 1 :(得分:5)

您需要使用bytes_le来获得匹配Microsoft's的字节序:

base64.urlsafe_b64encode(uuid.UUID("fa190535-6b00-4452-8ab1-319c73082b60").bytes_le)

得到b'NQUZ-gBrUkSKsTGccwgrYA=='