URLで使用するために短くしたい数字の文字列があります。この文字列は常に数字のみで構成されます。例:9587661771112
理論的には、数値文字列を英数字(0-9a-zA-Z)文字列に暗号化すると、常に短い結果が返されるはずです。これが私が望むものです。
次のことを行うアルゴリズムを作成しました。
暗号化(string1 =数値入力文字列、string2 =英数字戻り文字列)
- string1から次の2文字を取得し、それらを数値に変換します。たとえば、上記の例では95です。
- 数値が52(azとAZの合計の長さ)未満であるかどうかを確認します
- その場合、string2に( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")[Number]を追加し、2文字前にジャンプします
- それ以外の場合は、string2に( "0123456789)[数値の最初の桁)を追加して、1文字前にジャンプします
次のステップでは、番号は58などになります。
私が得ることができた最短の結果を微調整すると、次のようになりました:9587661771112> j9UQpjva
私の問題は、この手法では結果が劇的に変化する可能性があることです。また、これは私の問題に対するクリーンな解決策ではないと感じています。
したがって、数字の文字列を大文字、小文字、数字の短い文字列に変換する暗号化アルゴリズムが必要です。復号化可能で、多かれ少なかれ一貫した結果が得られる必要があります。
これを達成する方法はありますか?
解決:
string Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
string Base10To62(long N)
{
string R = "";
while (N != 0)
{
R += Chars[(int)(N % 62)];
N /= 62;
}
return R;
}
long Base62To10(string N)
{
long R = 0;
int L = N.Length;
for (int i = 0; i < L; i++)
{
R += Chars.IndexOf(N[i]) * (long)Math.Pow(62, i);
}
return R;
}
魅力のように機能します:)