我试图找到将10个整数(大约在1到10000之间)的列表编码为单个id的最佳方法(我需要在整数列表到单个整数或字符串之间的一对一函数)。
我试过base64(这很好,因为它是可逆的),但结果比输入长得多,而且非常糟糕。
例如,如果我想编码12-54-235-1223-21-765-43-763-9522-908,
base64给了我MTItNTQtMjM1LTEyMjMtMjEtNzY1LTQzLTc2My05NTIyLTkwOA ==
哈希函数很糟糕,因为我无法轻松恢复输入。
也许我可以使用这样一个事实:我只有数字作为输入并使用数论理论,有人有想法吗?
答案 0 :(得分: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]