簡體   English   中英

Java中BASE64類的編碼/解碼算法效率如何?

[英]How efficient is the encoding/decoding algorithm of BASE64 class in Java?

我將使用一種算法來編碼從XML文件中檢索的可變長度但非常長的String字段,然后該編碼數據應該保留在數據庫中。

后來,當我收到第二個文件時,我需要從數據庫中獲取編碼數據(先前存儲過的),然后對其進行解碼並使用新數據驗證是否重復。

我試過org.apache.commons.codec.binary.Base64類它有2個方法:

  1. encodeBase64(Byte[] barray)
  2. decodeBase64(String str)

它完美無缺,解決了我的問題。 但它將55個字符串轉換為僅6個字符串。

所以我想知道是否存在這些算法編碼2個字符串的情況,這些字符串非常大並且只有1個字符不匹配(例如)到相同的編碼字節數組中。

我不太了解Base64課程,但如果有人能幫助我,那將非常有幫助。

如果你可以建議任何其他算法使一個大的String短的固定長度並解決我的目的,我將很樂意使用它。

提前致謝。

不是很有效率。

此外,使用sun.misc類提供了一個非便攜式應用程序。

查看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" ) )

在這里,您將字符串轉換為字節數組,並使用無損壓縮來減少必須存儲的字節數。 您可以改變字符編碼和壓縮算法,以減少字節數,具體取決於您將要存儲的字符串(即,如果它主要是ASCII,那么UTF-8可能是最好的。

優點 :沒有碰撞,恢復原始字符串的能力
缺點 :存儲值所需的字節是可變的; 存儲值所需的字節數較大

解決方案2

使用散列算法

SHA256( UTF8( "test" ) )

在這里,您將使用散列函數將字符串轉換為固定長度的字節集。 散列是單向的,並且本質上可以發生碰撞 但是,根據您希望處理的字符串和字符串數量,您可以選擇哈希函數以最小化沖突的可能性

優點 :存儲價值所需的字節數是固定的; 存儲值所需的字節很小
缺點 :碰撞可能,無法恢復原始字符串

我剛看到你的評論 - 看起來你實際上正在尋找壓縮而不是像我最初想的那樣散列。 雖然在這種情況下,你將無法獲得任意輸入的固定長度輸出(考慮一下,無限數量的輸入不能雙射地映射到有限數量的輸出),所以我希望這不是一個強烈的要求。

在任何情況下,您選擇的壓縮算法的性能將取決於輸入文本的特征。 在沒有進一步信息的情況下,DEFLATE壓縮(由Zip輸入流IIRC使用)是一個很好的通用算法,並且至少用作比較的基礎。 但是,為了便於實現,您可以使用JDK中內置的Deflator類,它使用ZLib壓縮。

如果輸入字符串具有特定模式,則不同的壓縮算法可能效率更高或更低。 在一個方面,如果您不打算通過任何其他進程讀取壓縮數據,那么使用哪一個並不重要 - 只要您可以自己壓縮和解壓縮,它對您的客戶來說就是透明的。

這些其他問題可能會引起關注:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM