我需要根据FirstName / LastName组合构建一个哈希。在数据库中,每个最大100个字符,哈希需要最多20个字符。
有没有办法可靠地生成基于此的唯一值?假设FirstName / LastName组合是唯一的。
答案 0 :(得分:2)
哈希绝不保证绝对唯一,不应将它们用作唯一标识符。
答案 1 :(得分:2)
实际上,良好的加密哈希几乎与其各自的消息一样独特。您所描述的内容与SHA-1非常相似, IF 您希望相同的FirstName / LastName映射到相同的“唯一”20个字符。完整SHA-1大于GUID(表示某些内容),并且是加密的,分布相当均匀,不太可能发生冲突(参见对SHA-1的冲突攻击 - 即使是故意也很难做到)。
答案 2 :(得分:1)
听起来你想要表中每条记录的唯一标识符,并且这个标识符不容易猜到。有多种方法可以实现这一目标,包括:
1. 为标识符添加unique
约束列,并在插入列时生成随机标识符。如果插入因标识符已存在而失败,请生成新标识符并重试。
2。在表格中添加auto GUID
列,让数据库生成唯一标识符。
3. 在表中添加auto-increment int
列,让数据库生成唯一标识符并对其进行模糊处理。例如,您可以通过将整数填充为16并使用128位分组密码对其进行加密来执行此操作。例如:
private static readonly AesManaged cipher = new AesManaged()
{
BlockSize = 128,
Key = Encoding.UTF8.GetBytes("secret__secret__"),
Mode = CipherMode.ECB,
Padding = PaddingMode.None
};
static string Obfuscate(int id)
{
using (var transform = cipher.CreateEncryptor())
{
return Convert.ToBase64String(
transform.TransformFinalBlock(
Encoding.UTF8.GetBytes(
id.ToString("0000000000000000")), 0, 16));
}
}
static int Deobfuscate(string s)
{
using (var transform = cipher.CreateDecryptor())
{
return int.Parse(
Encoding.UTF8.GetString(
transform.TransformFinalBlock(
Convert.FromBase64String(s), 0, 16)));
}
}
注意,这些方法都不能猜测标识符,只比将整数递增1更难。您仍然需要检查用户是否有权查看与之关联的信息标识符。