对于您要实现的目标(防止第 3 方确定您的用户标识符),直接 MD5 或 SHA1 哈希是不够的。32 位 = 大约 40 亿个值,第 3 方暴力破解每个值(@1m 哈希/秒)只需不到 2 小时。我真的建议改用HMAC-SHA1。
至于碰撞,这个问题对它们的可能性有一个非常好的答案。tl;dr 对于 32 位输入,冲突非常小。
如果您的用户标识符不是随机的(它们以 1 递增或存在用于创建它们的已知算法),那么您没有理由不能生成每个散列以确保不会发生冲突。
这将检查前 10,000,000 个整数是否与 HMAC-SHA1 发生冲突(运行大约需要 2 分钟):
public static bool checkCollisionHmacSha1(byte[] key){
HMACSHA1 mac = new HMACSHA1(key);
HashSet<byte[]> values = new HashSet<byte[]>();
bool collision = false;
for(int i = 0; i < 10000000 && collision == false; i++){
byte[] value = BitConverter.GetBytes(i);
collision = !values.Add(mac.ComputeHash(value));
if (collision)
break;
}
return collision;
}