0

我正在尝试找到将 10 个整数列表(大约在 1 到 10000 之间)编码为单个 id 的最佳方法(我需要一个整数列表到单个整数或字符串之间的一对一函数)。

我尝试了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 回答