我找不到这个问题的答案。如果我使用 Base64 对字符串进行编码,那么基于该字符串的编码输出是否是唯一的?我之所以问这个问题,是因为我想创建一个包含用户信息的令牌,所以我需要确保输出将根据信息而定是唯一的。
例如,如果我对“UnqUserId:987654321 Timestamp:01/02/03”进行编码,那么它是否是唯一的,因此无论我放入什么其他用户ID,都永远不会发生冲突?
我找不到这个问题的答案。如果我使用 Base64 对字符串进行编码,那么基于该字符串的编码输出是否是唯一的?我之所以问这个问题,是因为我想创建一个包含用户信息的令牌,所以我需要确保输出将根据信息而定是唯一的。
例如,如果我对“UnqUserId:987654321 Timestamp:01/02/03”进行编码,那么它是否是唯一的,因此无论我放入什么其他用户ID,都永远不会发生冲突?
虽然晚了两年,但是我们终于来了:
简短的回答是是的,唯一的二进制/十六进制值总是会编码为唯一的base64编码字符串。
但是,多个base64编码的字符串可能表示一个单一的二进制/十六进制值。
这是因为十六进制字节与base64“数字”不对齐。一个十六进制字节由8位表示,而一个base64数字由6位表示。因此,任何不是6位对齐的十六进制值可能具有多个base64表示形式(尽管正确实现的base64编码器应该编码为相同的base64表示形式)。
一个示例是十六进制值“0x433356c1”。该值由32位表示,并且被base64编码为“QzNWwQ==”。然而,这个32位值不是6位对齐的。那么会发生什么?在这种情况下,base64编码器在二进制表示的末尾填充四个零比特,使序列变为36位,从而对齐为6位。
解码时,base64解码器现在必须解码成8位对齐的值。它截断填充的比特并将前32位解码为十六进制值。例如,“QzNWwc==”和“QzNWwQ==”是不同的base64编码字符串,但解码为相同的十六进制值0x433356c1。如果我们仔细观察,我们注意到这两个编码字符串的前32位是相同的:
'QzNWwc==':
010000 110011 001101 010110 110000 011100
'QzNWwQ==':
010000 110011 001101 010110 110000 010000
唯一的区别在于最后四位被忽略。请记住,任何base64编码器不应该生成'QzNWwc =='或任何0x433356c1的其他base64值,而不是'QzNWwQ == ',因为添加的填充字节应始终为零。
总之,可以安全地假定一个唯一的二进制/十六进制值将始终使用正确实现的base64编码器编码为唯一的base64表示形式。只有在生成没有清零填充/对齐字节的base64字符串时,才会在解码期间发生“冲突”。