base64 编码的字符串是否唯一?
Is a base64 encoded string unique?
我找不到这个问题的答案。如果我使用 Base64 对字符串进行编码,编码后的输出是否会基于该字符串是唯一的?我问是因为我想创建一个包含用户信息的令牌,所以我需要确保输出根据信息是唯一的。
例如,如果我编码 "UnqUserId:987654321 Timestamp:01/02/03" 这是否是唯一的,那么无论我将其放入哪个其他用户 ID 都不会发生冲突?
晚了两年,但我们开始了:
简短的回答是是的,唯一的binary/hex值将总是编码为唯一的base64编码字符串。
但是,多个 base64 编码字符串可能代表一个 binary/hex 值。
这是因为十六进制字节未与 base64 对齐'digits'。单个十六进制字节由 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
唯一的区别是最后四位被忽略了。请记住,除了 'QzNWwQ==' 之外,没有任何 base64 编码器 应该 为 0x433356c1 生成 'QzNWwc==' 或任何其他 base64 值,因为添加的填充字节应始终为零。
总而言之,可以安全地假设唯一的 binary/hex 值将始终使用正确实现的 base64 编码器编码为唯一的 base64 表示。如果生成的 base64 字符串没有清零 padding/alignment 字节,则 'collision' 只会在解码期间出现。
我找不到这个问题的答案。如果我使用 Base64 对字符串进行编码,编码后的输出是否会基于该字符串是唯一的?我问是因为我想创建一个包含用户信息的令牌,所以我需要确保输出根据信息是唯一的。
例如,如果我编码 "UnqUserId:987654321 Timestamp:01/02/03" 这是否是唯一的,那么无论我将其放入哪个其他用户 ID 都不会发生冲突?
晚了两年,但我们开始了:
简短的回答是是的,唯一的binary/hex值将总是编码为唯一的base64编码字符串。
但是,多个 base64 编码字符串可能代表一个 binary/hex 值。
这是因为十六进制字节未与 base64 对齐'digits'。单个十六进制字节由 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
唯一的区别是最后四位被忽略了。请记住,除了 'QzNWwQ==' 之外,没有任何 base64 编码器 应该 为 0x433356c1 生成 'QzNWwc==' 或任何其他 base64 值,因为添加的填充字节应始终为零。
总而言之,可以安全地假设唯一的 binary/hex 值将始终使用正确实现的 base64 编码器编码为唯一的 base64 表示。如果生成的 base64 字符串没有清零 padding/alignment 字节,则 'collision' 只会在解码期间出现。