要散列的文本长度是否会影响碰撞的概率?

时间:2017-07-05 18:24:35

标签: cryptography sha1 hash-collision

我想使用带有唯一salt的sha1创建唯一代码(绝对唯一,因为我使用表中的id)。我需要7个字符的唯一代码,但我不能使用我的表中的id,因为它超过7个字符。因此我认为使用sha1并将散列文本的前7个字符作为我的唯一代码更好。要散列的文本长度是否会影响碰撞的概率?

例如:

textA = "myId:12345678"
textB = "myId:12345678, myId2:87654321"

使用长短文本(例如textA)或文本(例如textB)是否更好?或文本长度没有影响?

1 个答案:

答案 0 :(得分:1)

散列您的唯一ID是一个坏主意。不要这样做。

如果您的ID由7个十六进制数字组成,则可以为您提供268,435,456个唯一值。如果您散列这些值并将结果截断为7个十六进制数字,那么the probability of a collision rises very quickly(2,322个输入后的概率为1%,19,290个输入后为50%,35,159个输入后为99%)。

如果你的目的是伪装这些ID值,以便对手无法弄清楚实际的连续值是什么,那么请改用format-preserving encryption

编辑:如果您需要安全的内容,可以尝试使用AES之类的加密功能作为舍入功能来实现Feistel network。 (AES可能过度,但这可以在大多数语言的几行代码中基于现有原语来实现。)如果你只想混淆ID,你可以使用更简单的东西:

def obfuscate_id(id, key):
    # Transforms id using a 28-bit key
    a = 81883721   # (random prime congruent to 1 mod 4)
    c = 2791751    # (any odd number will do)
    m = 2**28      # (modulus for 7-digit hex values)
    return ((id ^ key) * a + c) % m