0

10 個の整数 (約 1 から 10000 の間) のリストを単一の ID にエンコードする最良の方法を見つけようとしています (整数のリストと単一の整数または文字列との間の 1 対 1 の関数が必要です)。

私は base64 を試しました (これは可逆なので良いです) が、結果は入力よりもはるかに長く、かなり悪いです。

たとえば、12-54-235-1223-21-765-43-763-9522-908 をエンコードしたい場合、

base64 は私に MTItNTQtMjM1LTEyMjMtMjEtNzY1LTQzLTc2My05NTIyLTkwOA== を与えます

入力を簡単に復元できないため、ハッシュ関数は良くありません。

入力として数字しかないという事実を使用して、数論の事実を使用できるかもしれませんが、誰かアイデアがありますか?

4

1 に答える 1

1

整数が 10^9 より小さいことが保証されている場合は、次のようにエンコードできます。

[number of digits in 1st number][1st number][number of digits in 2nd number][2nd number][...]

したがって12,54,235,1223,21,765,43,763,9522,908、 が得られ21225432354122322137652433763495223908ます。

サンプルの Python 実装:

def numDigits(x):
    if x < 10:
        return 1
    return 1 + numDigits(x/10)

def encode(nums):
    ret = ""
    for number in nums:
        ret = ret + str(numDigits(number)) + str(number)
    return ret

def decode(id):
    nums = []
    while id != "":
        numDigits = int(id[0])
        id = id[1:] #remove first char from id
        number = int(id[:numDigits])
        nums.append(number)
        id = id[numDigits:] #remove first number from id
    return nums

nums = [12,54,235,1223,21,765,43,763,9522,908]
id = encode(nums)
decodedNums = decode(id)
print id
print decodedNums

結果:

21225432354122322137652433763495223908
[12, 54, 235, 1223, 21, 765, 43, 763, 9522, 908]
于 2013-04-29T12:11:54.963 に答える