6

興味深い問題があります - 2 つの (ランダムに) 生成された Guid を文字列に変換する必要があります。制約は次のとおりです。

  1. 文字列の最大長は 50 文字です。
  2. 数字と小文字のみ使用可能 (0123456789abcdefghijklmnopqrstuvwxyz)
  3. アルゴリズムは双方向でなければなりません - エンコードされた文字列を同じ 2 つの別々の GUID にデコードできる必要があります。

私は toBase36 変換を探してたくさん閲覧してきましたが、これまでのところ Guid では運がありません。

何か案は?(C#)

4

1 に答える 1

10

36^50 は約 2^258.5 なので、50 バイトの base-36 文字列に情報を格納できます。しかし、なぜ誰もがこれに base-36 を使用しなければならないのでしょうか。

各 GUID を 128 ビットの数値として扱い、それらを組み合わせて 256 ビットの数値にし、それを base-36 の「数値」に変換する必要があります。逆変換は、同じことを逆に行うことです。

Guid.ToByteArrayGUID を 16 バイト配列に変換します。両方の GUID に対してこれを行うと、32 バイト (256 ビット) の配列が得られます。その配列からaを構築し(コンストラクBigIntターがあります)、その数値をbase-36に変換するだけです。

数値を base-36 に変換するには、次のようにします (すべてが正であると仮定します)。

const string digits = "0123456789abcdefghijklmnopqrstuvwxyz";

string ConvertToBase36(BigInt number)
{
    string result = "";
    while(number > 0)
    {
        char digit = string[number % 36];
        result += digit;
        number /= 36;
    }
}
于 2012-03-17T00:53:45.100 に答える