【问题标题】:Encode a list of ids in an elegant id在优雅的 id 中编码 id 列表
【发布时间】:2013-04-29 20:11:54
【问题描述】:

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

我尝试了base64(这很好,因为它是可逆的),但结果比输入要长得多,这很糟糕。

例如,如果我想编码 12-54-235-1223-21-765-43-763-9522-908,

base64 给了我 MTItNTQtMjM1LTEyMjMtMjEtNzY1LTQzLTc2My05NTIyLTkwOA==

散列函数很糟糕,因为我无法轻松恢复输入。

也许我可以使用我只有数字作为输入的事实并使用数论事实,有人有想法吗?

【问题讨论】:

    标签: math encoding uniqueidentifier


    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 2020-02-11
      • 1970-01-01
      相关资源
      最近更新 更多