【问题标题】:Generating a unique Hash based on DateTime and String parameter根据 DateTime 和 String 参数生成唯一的 Hash
【发布时间】:2018-01-29 13:20:05
【问题描述】:

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

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

日期参数格式如下:

2017-08-14 11:55:32.00

ID 格式如下:

112452573848

我想生成一个长度为 40 个字符且永不重复的唯一哈希。

这可以用 datetime 参数 + 唯一的 id 字符串吗?

我认为 datetime 永远不会相同(这几乎是不可能的),因此这应该能够始终产生独特的价值?

【问题讨论】:

  • 您可能会通过组合这 2 个来获得重复项(除非 ID 始终是唯一的)。如果您想要一个有点独特的字符串,请查看Guid.NewGuid()
  • @Shyju 是的,ID 总是唯一的,最好的散列方法是什么? :)
  • @adiga 只是组合了两个字符串? :D
  • 改用 Guid,它正是为此而创建的。使用您的方法,我可以根据需要多次传递相同的 DateTime 实例和 ID 字段
  • @CamiloTerevinto 我不能使用 GUID,因为数据来自 API 源,我需要以某种方式对其进行哈希处理,以便比较我的数据库和 API 中的值 ^^跨度>

标签: c# datetime hash


【解决方案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))。

【讨论】:

    猜你喜欢
    • 2013-05-22
    • 2011-09-05
    • 1970-01-01
    • 2019-03-08
    • 2015-06-14
    • 1970-01-01
    • 2020-06-09
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多