要散列的文本的长度是否会影响冲突的概率?
Does the length of the text to be hashed affect the probability of a collision?
我想用 sha1 和独特的 salt 制作独特的代码(绝对独特,因为我使用 table 的 id)。我需要 7 个字符的唯一代码,但我不能使用 table 中的 id,因为它超过 7 个字符。所以我认为最好使用 sha1 并将散列文本的前 7 个字符作为我的唯一代码。待哈希的文本长度是否影响碰撞概率?
例如:
textA = "myId:12345678"
textB = "myId:12345678, myId2:87654321"
使用长短文本(例如textA)还是文本(例如textB)更好?还是文字长度没有影响?
散列您的唯一 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
我想用 sha1 和独特的 salt 制作独特的代码(绝对独特,因为我使用 table 的 id)。我需要 7 个字符的唯一代码,但我不能使用 table 中的 id,因为它超过 7 个字符。所以我认为最好使用 sha1 并将散列文本的前 7 个字符作为我的唯一代码。待哈希的文本长度是否影响碰撞概率?
例如:
textA = "myId:12345678"
textB = "myId:12345678, myId2:87654321"
使用长短文本(例如textA)还是文本(例如textB)更好?还是文字长度没有影响?
散列您的唯一 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