Base64编码是否保留字母顺序?

7
假设我有一个按字母顺序排序的100个单词列表。 如果我对这些单词进行base64编码,然后再次对结果进行排序,元素的顺序会保持不变吗?
如果不是,是否有任何其他编码算法可以为我提供此行为?

这个听起来非常容易测试,只需要很少的努力。请查看https://www.base64encode.org/。我猜测,在base64编码和解码之间,是保留了顺序的。 - MonkeyZeus
1
我可以运行这样一个小测试,看看排序是否对该集合保持不变,但实际上很难证明它适用于所有单词集合。恐怕会有一些罕见情况下顺序无法保留。 - Bart van der Drift
我真的不明白你害怕的确切情况。你能提供一个你担心会发生什么的样本吗? - MonkeyZeus
当然,我们有一个大型数据集将通过API公开。我们希望以页面的形式返回数据集,其中每个页面都包含指向下一页的续订令牌。我们还希望按照数据中某个字段的字母顺序返回数据集。因此,想法是将该字段与其记录ID连接起来(以确保唯一性),然后将该值保存为数据库中的额外列。然后,我们可以使用该列作为续订令牌,并轻松选择下一个X条记录。 - Bart van der Drift
如果Base64编码不保留字母顺序,那么结果集中可能会缺少记录。 - Bart van der Drift
1个回答

14

不,base64不能保留未编码字符串的排序顺序。

这在RFC 4648中有解释,它还定义了一种称为base32hex的编码,该编码明确保证维护排序顺序。

如果你想坚持使用官方标准,我所知道的最好选择是base32hex。

然而,如果编码的空间效率很重要,从base64降到base32会有点令人沮丧。如果是这种情况,你可以创建自己的编码(这并不难)或采用别人的编码(JavaScript示例:https://github.com/dominictarr/d64)。


3
uuencode 是一种现有的标准,它能够保留数据排序,因为它只使用从 <space> 到 _ 的 64 个连续字符来编码数据。 - Parakleta
同样地,如果空间效率并不太重要,十六进制(基数16)仍然是一个选项,并且它是一个更简单的二进制编码/解码方式。 - thomasrutter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接