基于DateTime和String参数

时间:2017-08-21 12:48:29

标签: c# datetime hash

我想创建一个函数,使我能够始终根据这两个输入参数生成唯一值:

public string ReturnUniqueValue(DateTime date, string ID)
{
 // Logic here
}

日期参数采用以下格式:

2017-08-14 11:55:32.00

虽然ID的格式如下:

112452573848

我想生成一个唯一的哈希,其长度为40个字符,并且它永远不会重复。

这是否适用于datetime参数+唯一ID字符串?

我认为日期时间永远不会相同(几乎不可能),因此应该能够始终生成唯一值?

1 个答案:

答案 0 :(得分:1)

你可以

  • 将所有参数(以较小者为单位)写入流
  • 使用您最喜欢的算法计算哈希值(例如SHA265)
  • 并返回其前20个值(= 40个字符)作为最终结果

在代码中:

public string ReturnUniqueValue(DateTime date, string ID)
{
    var result = default(byte[]);

    using (var stream = new MemoryStream())
    {
        using (var writer = new BinaryWriter(stream, Encoding.UTF8, true))
        {
            writer.Write(date.Ticks);
            writer.Write(ID);
        }

        stream.Position = 0;

        using (var hash = SHA256.Create())
        {
            result = hash.ComputeHash(stream);
        }
    }

    var text = new string[20];

    for (var i = 0; i < text.Length; i++)
    {
        text[i] = result[i].ToString("x2");
    }

    return string.Concat(text);
}

注意:如果您只想为多个参数提供单个唯一值,则应该已经进行了简单的连接。由于您明确要求使用包含40个字符的“哈希”,因此这种更精细的解决方案可能更适合。

注意:将此扩展到更多相同类型的参数(例如两个字符串)应包括流中的参数位置以避免冲突((a,b)!=(b,a))。