我找不到答案.如果我用Base64编码一个字符串,编码输出是否会根据字符串唯一?我问,因为我想创建一个包含用户信息的令牌,所以我需要确保输出将是唯一的,具体取决于信息.
例如,如果我编码"UnqUserId:987654321时间戳:01/02/03"这将是唯一的,所以无论我把它放在哪里的其他用户ID永远不会发生碰撞?
sea*_*ano 52
迟了两年,但我们走了:
简短的回答是肯定的,唯一的二进制/十六进制值将始终编码为唯一的base64编码字符串.
但是,多个base64编码的字符串可以表示单个二进制/十六进制值.
这是因为十六进制字节与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
Run Code Online (Sandbox Code Playgroud)
唯一的区别是最后四位被忽略.请记住,除了'QzNWwQ =='之外,任何base64编码器都不应生成'QzNWwc =='或0x433356c1的任何其他base64值,因为添加的填充字节应始终为零.
总之,可以安全地假设使用正确实现的base64编码器,唯一的二进制/十六进制值将始终编码为唯一的base64表示.如果生成base64字符串而不归零填充/对齐字节,则仅在解码期间发生"冲突".
| 归档时间: |
|
| 查看次数: |
10474 次 |
| 最近记录: |