校验和以获取数字列表

时间:2016-09-19 22:33:03

标签: python algorithm checksum

我有大量的整数列表。我想检查是否有任何列表是重复的。我认为这样做的一个好方法是计算一个基本校验和,然后只检查校验和是否一致的元素。但我找不到具有良好属性的校验和算法,即:

  • 有效验证订单;
  • 快速计算;
  • 返回一个小结果,例如短整数;
  • 分布相当均匀,不同列表的概率很低。

例如,函数check_sum在后面的5个调用中返回[0,65536]范围内的不同数字将是理想的。

check_sum([1,2,3,4,5])
check_sum([1,2,3,5,4])
check_sum([5,4,3,2,1])
check_sum([1,2,3,4,4])

我查看了IPv4标头校验和算法,该算法返回大小合适的结果但不检查顺序,因此不是我正在寻找的。

我将在python中实现它,但任何格式都可以用于算法,或者指向一个好的参考材料。

3 个答案:

答案 0 :(得分:0)

使用hash()计算校验和:

checksums = \
    list(
        map(
            lambda l:
                hash(tuple(l)),
            list_of_lists
        )
    )

要知道你有多少重复:

from collections import Counter

counts = Counter(checksums)

编制一个唯一的清单:

unique_list = list(dict(zip(checksums, list_of_lists)).values())

答案 1 :(得分:0)

如果你想要一些朴素的东西,可以使用Fletcher校验和版本。

def check_sum(l):
    sum1 = sum2 = 0
    for v in l:
        sum1 = (sum1 + v) % 255
        sum2 = (sum2 + sum1) % 255
    return sum1*256 + sum2

print(
    check_sum([1,2,3,4,5]),
    check_sum([1,2,3,5,4]),
    check_sum([5,4,3,2,1]),
    check_sum([1,2,3,4,4])
)

答案 2 :(得分:0)

应该是mod 256吗?

 def check_sum(l):
    sum1 = sum2 = 0
    for v in l:
        sum1 = (sum1 + v) % 256
        sum2 = (sum2 + sum1) % 256
    return sum1*256 + sum2

print(
    check_sum([1,2,3,4,5]),
    check_sum([1,2,3,5,4]),
    check_sum([5,4,3,2,1]),
    check_sum([1,2,3,4,4])
)