我将要使用一种算法来编码可变长度但很长的字符串,该字符串是从XML文件检索的字段,然后该编码数据应保留在数据库中。
稍后,当我收到第二个文件时,我需要从数据库(先前存储的)中获取编码数据,然后对其进行解码并使用新数据进行验证以确保重复。
我尝试了org.apache.commons.codec.binary.Base64
类
它有2种方法:
encodeBase64(Byte[] barray)
decodeBase64(String str)
可以很好地解决我的问题。
但是它将55个字符的字符串转换为6个字符的字符串。
因此,我想知道是否存在这些算法将2个非常大且仅具有1个字符不匹配(例如)的字符串编码到相同的编码字节数组中的情况。
我对
Base64
类知之甚少,但是如果有人可以帮助我,它将非常有帮助。如果您可以建议使用其他任何算法,使长度固定长度的大String短并且可以解决我的目的,我将很乐意使用它。
提前致谢。
最佳答案
不是很有效。
同样,使用sun.misc
类提供了不可移植的应用程序。
查看MiGBase64的以下性能比较:
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可能是最佳选择。
优点:无冲突,能够恢复原始字符串
缺点:存储值所需的字节是可变的;默认值为0。存储值所需的字节更大
解决方案2
使用哈希算法
SHA256( UTF8( "test" ) )
在这里,您将使用哈希函数将字符串转换为固定长度的字节集。散列是单向的,其本质是collisions can be possible。但是,根据您希望处理的字符串的配置文件和数量,可以选择一个哈希函数以最大程度地减少冲突的可能性
优点:存储值所需的字节是固定的;存储值所需的字节很小
缺点:可能发生冲突,无法恢复原始字符串
关于java - Java中BASE64类的编码/解码算法的效率如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6355704/