有没有办法从200个字符中获得20个字符串?

时间:2012-11-12 03:21:17

标签: c# hash

我需要根据FirstName / LastName组合构建一个哈希。在数据库中,每个最大100个字符,哈希需要最多20个字符。

有没有办法可靠地生成基于此的唯一值?假设FirstName / LastName组合是唯一的。

3 个答案:

答案 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更难。您仍然需要检查用户是否有权查看与之关联的信息标识符。