数値を Base64 に圧縮するアルゴリズムを考えたため
紹介してみようと思います。
圧縮率 55% 程度と思われます。
先頭の 0 が消えるため
long 型の数値を保存したい場合など
先頭が 0 でない数値に
活用頂けると幸いです。
1byte 文字は 95 文字あるハズなので
Base95 にする事もできます。
そうすればより圧縮できますが
圧縮率 50% を少し切る程度のハズなので
どちらも大差ないハズです。
管理を簡単にするために
コンマを使いたくないなどの場合は
Base94 等に妥協する事になりますが
そういった修正を後々行うのは面倒なので
Base64 に抑えておくのが
結果的に楽だと思われます。
圧縮・展開するコード
public static string CompressNumberToBase64(string targetNumber)
{
string thinking = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
System.Text.StringBuilder create = new();
System.Numerics.BigInteger nowBigInteger = System.Numerics.BigInteger.Parse(targetNumber);
System.Numerics.BigInteger bigInteger64 = new(64);
System.Numerics.BigInteger outBigInteger;
while (0 <= nowBigInteger.CompareTo(bigInteger64))
{
System.Numerics.BigInteger.DivRem(nowBigInteger, bigInteger64, out outBigInteger);
create.Append(thinking[(int)outBigInteger]);
nowBigInteger = System.Numerics.BigInteger.Divide(nowBigInteger, bigInteger64);
}
System.Numerics.BigInteger.DivRem(nowBigInteger, bigInteger64, out outBigInteger);
create.Append(thinking[(int)outBigInteger]);
return create.ToString();
}
public static string DecompressBase64ToNumber(string targetComperssNumber)
{
string thinking = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
System.Numerics.BigInteger nowBigInteger = new(0);
System.Numerics.BigInteger bigInteger64 = new(64);
for (int i = targetComperssNumber.Length - 1; 0 <= i; i--)
{
nowBigInteger = BigInteger.Multiply(nowBigInteger, bigInteger64);
nowBigInteger = BigInteger.Add(nowBigInteger, thinking.IndexOf("" + targetComperssNumber[i]));
}
return nowBigInteger.ToString();
}
コメント欄にて
改善できる点を指摘頂いたため
反映しています。
コメント感謝します。
このコードで 10000 桁の数値を圧縮すると
5537 文字に圧縮できています。
10 桁の数値も 6 文字に圧縮できています。
よって 55% 程度の圧縮率と思われます。
long 型の数値しか変換しないと
分かっているならば
BigInteger を long に書き換えた方が
確実に早いハズです。
チート対策の観点としては
暗号化と複合して実装する前提にはなりますが、
地味にチェックサムとは相性がいいかもしれません。
以上数値を 55% 程度の文字数に
圧縮するアルゴリズムを紹介しました。
圧縮率 55% というのは
10 の 10乗 が 10億 で
64 の 5乗 が 10億7000万 程度である事を考量すると
そんなものかと思います。
「より高速で動作する」「より圧縮率が高い」など
より優れたアルゴリズムを
知っている方がいらっしゃれば
是非コメント欄で教えて頂けると幸いです。
今回はここまで。
閲覧ありがとうございました。