【问题标题】:How to get same hash value also with different instances [duplicate]如何使用不同的实例也获得相同的哈希值[重复]
【发布时间】:2019-04-11 16:57:36
【问题描述】:

我通过创建和使用哈希值来设置数据库条目的 ID。 问题是当我再次启动应用程序时,相同原始值的哈希值不同,并且我得到了加倍(相同的值,不同的 ID)。 您可以在下面找到我的示例代码。启动 CLI,记住给定的哈希值,重新开始 --> 不同的值。

如何为每个实例重现相同的哈希值?

static void Main(string[] args)
{
    int drid = 3081;
    DateTime dt = DateTime.ParseExact("2019-04-11 00:23:10", "yyyy-MM-dd HH:mm:ss", null);
    string idAsString = drid.ToString() + dt.ToString();
    Console.WriteLine(idAsString.GetHashCode().ToString());
    Console.ReadKey();
}

【问题讨论】:

标签: c# .net-core


【解决方案1】:

不要这样做。永远不会。哈希码远不是唯一的,并且在某些时候语义上不同的对象会导致冲突 - 即两者都会产生完全相同的哈希码,这反过来会破坏您的数据库。

接下来要注意的是散列对象很复杂。只要您的对象存在,最好保持哈希码相同,这意味着您计算一次 - 在创建对象时 - 或动态计算它忽略可变字段(因为通常每个突变将更改哈希码)。

不仅如此:想出足够好的散列算法并不容易:一种足够不可预测但很少发生冲突的散列算法。

【讨论】:

  • 虽然这是正确的,但使用 SHA2-256 或 SHA2-512(.NET 还没有 SHA3)之类的东西会大大降低冲突的可能性
  • @CamiloTerevinto,它不会改变事情。 ID 是唯一的,哈希不是。
  • “更重要的是:想出足够好的散列算法并不容易:一种足够不可预测但又很少发生冲突的散列算法。”这并不难。避免冲突主要归结为只是增加散列的大小,只要散列算法不是真的很糟糕。对于任何重要的集合大小,散列到 int 的冲突率永远不会很低,但它不需要 那么 大,以使冲突的几率足够低太阳更有可能在碰撞发生之前爆炸,这对于大多数用途来说已经足够了。
  • @Servy,我们不是在讨论散列算法本身,而是在特定(复杂?)对象上实现 GetHashCode() 的方式。
  • @SerejaBogolubov 不,您确实实际上需要不可避免地调用GetHashCode 来计算字符串的哈希值。您可以绝对编写代码来计算散列而不使用它。您认为除了string.GetHashCode 之外不可能编写任何散列算法是没有意义的。为什么你认为这是散列任何东西的唯一可能方法?
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2014-06-03
  • 2017-09-07
  • 2019-05-08
  • 2011-11-12
  • 2012-01-17
相关资源
最近更新 更多