Java中BASE64类的编码/解码算法的效率如何?

问题描述

| 我将要使用一种算法来对可变长度但从XML文件中检索到的很长的String字段进行编码,然后将编码后的数据保留在数据库中。 稍后,当我收到第二个文件时,我需要从数据库(先前存储的)中获取编码后的数据,然后对其进行解码并使用新数据进行重复验证。 我尝试了
org.apache.commons.codec.binary.Base64
课 它有2种方法
encodeBase64(Byte[] barray)
decodeBase64(String str)
可以很好地解决我的问题。 但是它将55个字符的字符串转换为6个字符的字符串。 因此,我想知道这些算法是否将2个非常大且仅具有1个字符不匹配的字符串编码到相同的编码字节数组中。 我对ѭ3级课程了解不多,但是如果有人可以帮助我,那将非常有帮助。 如果您可以建议使用其他任何算法,使长度固定长度的大String短并且可以解决我的目的,我将很乐意使用它。 提前致谢。     

解决方法

        不是很有效。 另外,使用“ 4”类将给出不可移植的应用程序。 查看来自MiGBase64的以下性能比较:   所以我想知道是否有什么情况   这些算法编码2个字符串   很大,只有1个   字符不匹配(例如)成相同的   编码的字节数组。 Base64不是哈希算法,它是一种编码,因此必须是双向的。必须避免冲突-否则解码将是不确定的。 Base64旨在表示ASCII字符串中的任意二进制数据。将Unicode字符串编码为Base64通常会增加所需的代码点数量,因为Unicode字符集需要多个字节。 Unicode字符串的Base64表示形式将根据所使用的编码(UTF-8,UTF-16)而有所不同。例如:
Base64( UTF8( \"test\" ) ) => \"dGVzdA==\"
Base64( UTF16( \"test\" ) ) => \"/v8AdABlAHMAdA==\"
解决方案1 使用无损压缩
GZip( UTF8( \"test\" ) )
在这里,您将字符串转换为字节数组,并使用无损压缩来减少必须存储的字节数。您可以更改char编码和压缩算法,以减少字节数,具体取决于要存储的字符串(即,如果大多数为ASCII,则UTF-8可能是最好的。 优点:无冲突,能够恢复原始字符串 缺点:存储值所需的字节是可变的;存储值所需的字节较大 解决方案2 使用哈希算法
SHA256( UTF8( \"test\" ) )
在这里,您将使用散列函数将字符串转换为固定长度的字节集。散列是单向的,从本质上讲,可能会发生冲突。但是,根据您希望处理的字符串的配置文件和数量,可以选择一个哈希函数以最大程度地减少冲突的可能性 优点:存储值所需的字节是固定的;存储值所需的字节很小 缺点:可能发生冲突,无法恢复原始字符串     ,        我刚刚看到了您的评论-似乎您实际上是在寻找压缩功能,而不是我最初想到的哈希。尽管在这种情况下,您将无法获得任意输入的固定长度输出(请考虑一下,无限数量的输入不能双射地映射到有限数量的输出),所以我希望这不是很强需求。 无论如何,您选择的压缩算法的性能将取决于输入文本的特征。在没有更多信息的情况下,DEFLATE压缩(由Zip输入流IIRC使用)是一个很好的通用算法,至少可以作为比较的基础。但是,为了便于实现,您可以使用JDK中内置的Deflator类,该类使用ZLib压缩。 如果您的输入字符串具有特定的模式,则不同的压缩算法可能会或多或少地提高效率。一方面,使用哪一个都无关紧要,如果您不希望任何其他进程读取压缩的数据-只要您可以自己压缩和解压缩,它对您就将是透明的客户。 这些其他问题可能会引起关注: 什么是Java的良好压缩算法? 有任何Java压缩工具吗?