2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

数値を Base64 に圧縮するアルゴリズム

Last updated at Posted at 2024-10-28

数値を 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万 程度である事を考量すると
そんなものかと思います。

「より高速で動作する」「より圧縮率が高い」など
より優れたアルゴリズムを
知っている方がいらっしゃれば
是非コメント欄で教えて頂けると幸いです。

今回はここまで。
閲覧ありがとうございました。

2
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?