我想使用带有唯一salt的sha1创建唯一代码(绝对唯一,因为我使用表中的id)。我需要7个字符的唯一代码,但我不能使用我的表中的id,因为它超过7个字符。因此我认为使用sha1并将散列文本的前7个字符作为我的唯一代码更好。要散列的文本长度是否会影响碰撞的概率?
例如:
textA = "myId:12345678"
textB = "myId:12345678, myId2:87654321"
使用长短文本(例如textA)或文本(例如textB)是否更好?或文本长度没有影响?
答案 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