2017-08-31 7 views
0

ロング(つまり、javaで)は8バイトのサイズで、非常に大きな数を格納できます。私はそれを文字列に変換したいが、メモリを失うことはない。基本的に100個の数字(800バイト)をとり、それを文字列(800バイトに近い)に変換してから、数字の配列に変換する必要があるとき。数値を文字列に変換してメモリを失うことなく

この問題の理由は、私はJWTトークンにかなりの数を格納したいので、もしそれらを文字列として使うと、これらの数値のサイズは理想的なものよりもはるかに大きくなります世界。どのようにこれを達成するための任意のアイデアですか?

答えて

2

これは基本的にはシリアル化しています。バイト配列に長い値をダンプしてから、このようなBase64として、互換性のある表現にそれをエンコード:それはあなたのためのより便利であれば

import java.util.Base64; 

public String encodeLongs(long[] numbers) { 
    byte[] bytes = new byte[8 * numbers.length]; 
    for (int i = 0; i < numbers.length; i++) { 
     // Taken from https://stackoverflow.com/questions/18687772/java-converting-long-to-bytes-which-approach-is-more-efficient 
     long v = numbers[i]; 
     int idx = i * 8; 
     bytes[idx + 0] = (byte)(v >>> 56); 
     bytes[idx + 1] = (byte)(v >>> 48); 
     bytes[idx + 2] = (byte)(v >>> 40); 
     bytes[idx + 3] = (byte)(v >>> 32); 
     bytes[idx + 4] = (byte)(v >>> 24); 
     bytes[idx + 5] = (byte)(v >>> 16); 
     bytes[idx + 6] = (byte)(v >>> 8); 
     bytes[idx + 7] = (byte)(v >>> 0); 
    } 
    return Base64.getEncoder().encodeToString(bytes); 
} 

また、文字列の代わりにバイト配列を返すことができます。 Base64エンコードは、元のサイズのおよそ1/3のオーバヘッドで発生します(UTF-8などのエンコーディングを使用する場合)。テキストベースの形式を使用している場合、一般的にゼロオーバーヘッドを持つことはできませんが、Base-122などの他のエンコーディングを調べることはできますが、Base64は普及しており、ほとんどの言語で既に実装されているという利点があります。

もう1つのオプションは、バイト配列を最初に圧縮し(たとえば、GZIP)、その後Base64でエンコードします。入力のサイズ、数字の性質(例えば、ある範囲内にあるかどうかなど)、および圧縮アルゴリズムによっては、多かれ少なかれ成功する可能性がありますが、数値が全範囲にわたってランダムに分布している場合長い数字の場合は、おそらく多くを圧縮することはできません。

+0

+1は本当に簡潔な答えであり、あなたの解が描かれた既存のSO質問へのクレジット/参照。 –

+0

@jdehesa、私はあなたがちょうどそれがコンパクトではないので、全体のオブジェクト(ロングの配列)としてそれをシリアル化することを提案していないと思いますか?または、私はここで何かを逃しています。 – eddyP23

+1

@ eddyP23まあ、私はあなたが単純で相互運用可能なフォーマットを望んでいたと思っていました。サイズに対して最適化されていないにもかかわらず、標準的なJavaのシリアライゼーションが導入するオーバーヘッドはどれくらいかとは言えません(また、配列のサイズなどの追加情報を格納する必要があります)。 [Kryo](https:// github。)のような[その他のシリアル化ライブラリ](https://stackoverflow.com/questions/239280/which-is-the-best-alternative-for-java-serialization)も参照できます。 com/EsotericSoftware/kryo)。いずれにしても、バイナリシリアル化を使用すると、テキスト互換のエンコーディングが必要になります。 – jdehesa

関連する問題