Cryptography 要散列的文本长度是否会影响冲突的概率?

Cryptography 要散列的文本长度是否会影响冲突的概率?,cryptography,sha1,hash-collision,Cryptography,Sha1,Hash Collision,我想用具有唯一salt的sha1生成唯一的代码(绝对是唯一的,因为我使用表中的id)。我需要7个字符的唯一代码,但我不能使用表中的id,因为它超过7个字符。所以我认为最好使用sha1并将哈希文本的前7个字符作为我的唯一代码。要散列的文本长度是否会影响冲突的概率 例如: textA = "myId:12345678" textB = "myId:12345678, myId2:87654321" 使用长短文本(如textA)还是文本(如textB)更好?或者文本长度没有影响吗?散列您的唯一ID是

我想用具有唯一salt的sha1生成唯一的代码(绝对是唯一的,因为我使用表中的id)。我需要7个字符的唯一代码,但我不能使用表中的id,因为它超过7个字符。所以我认为最好使用sha1并将哈希文本的前7个字符作为我的唯一代码。要散列的文本长度是否会影响冲突的概率

例如:

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

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

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

如果您的ID由7个十六进制数字组成,则可以使用268435456个唯一值。如果散列这些值并将结果截断为7个十六进制数字,则(2322次输入后的概率为1%,19290次输入后的概率为50%,35159次输入后的概率为99%)

如果您的目标是伪装这些ID值,以便对手无法确定实际的顺序值,那么请改用

编辑:如果您需要安全的东西,可以尝试使用加密函数(如AES)作为round函数来实现。(AES可能有些过分,但这可以在基于现有原语的大多数语言中用几行代码来实现。)如果您只想混淆ID,可以使用以下更简单的方法:

def模糊识别码(id,key):
#使用28位密钥转换id
a=81883721#(与1模4全等的随机素数)
c=2791751#(任何奇数都可以)
m=2**28#(7位十六进制值的模数)
返回((id^键)*a+c)%m

另请参见Kelsey在上的工作。没有证据表明截断的散列与完整散列具有相同的属性。如果可能,您应该避免截断。也许你可以用。FPE有随附的证据。jww感谢您的建议。我读过关于格式保留加密的书。事实上,我的目标不是伪装这些ID值,而是生成随机的唯一代码(仅7或8个字符串)。我想我可以使用这些ID作为唯一的代码,但我的ID有很多字符。所以我需要把它改成7或8位数。如果可能的话,让我知道我怎么做。Thanks@FerryGideon对不起,耽搁了;我已经稍微更新了答案。