【问题标题】:hash that maps strings to integers将字符串映射到整数的哈希
【发布时间】:2012-01-25 15:31:04
【问题描述】:

寻找一些散列函数来进行字符串到整数的映射,但有以下限制。

限制: 相同的字符串指向相同的数字。 不同的字符串对应不同的数字。 在一次应用程序运行期间,我从相同长度获取字符串,只有在运行时我才知道长度。

关于如何创建哈希函数有什么建议吗?

【问题讨论】:

  • 使用 String.GetHashCode() 方法。
  • @Yuck ,字符串可以是任意 ASCII 值
  • @AVD 虽然在 C# 中是GetHashCode()。
  • 为什么票数接近?这是一个简单的问题,但却是一个有效且明确的问题。
  • @L.B:但这确实具有误导性。他要求 X。你给了他一个答案,但没有表明它不满足 X。

标签: c# .net data-structures hash hashmap


【解决方案1】:

哈希函数永远不能保证两个不同的值(在您的情况下为字符串)产生不同的哈希码。但是,相同的值将始终产生相同的哈希码。

这是因为信息丢失了。如果您有一个长度为 32 个字符的字符串,它将有 64 个字节(每个字符 2 个字节)。 int 哈希码有四个字节。这是不可避免的,称为碰撞。

注意:Dictionary<Tkey,TValue> 在内部使用哈希表。因此,它实现了冲突解决策略。请参阅 MSDN 上的 An Extensive Examination of Data Structures Using C# 2.0。

这是dictionary.cs的当前实现。

【讨论】:

    【解决方案2】:

    您不会找到一种哈希算法来保证不会为不同的字符串返回相同的整数。根据定义,哈希算法有冲突。世界上可能的字符串比可能的 32 位整数要多得多。

    【讨论】:

      【解决方案3】:

      不同的字符串对应不同的数字。

      字符串多于数字,因此在不限制输入集的情况下这是完全不可能的。你不能把n 鸽子放在m 和n > m 的盒子里,而至少一个盒子里装着不止一只鸽子。

      【讨论】:

        【解决方案4】:

        String.GetHashCode 函数是否不适合您的需求?

        【讨论】:

        • 它不满足不同字符​​串到不同数字的不可能要求。
        • @Jason:是的,但 GetHashCode 确保的高概率可能足以满足 OP 的要求。
        • @Heinzi - 当他的应用程序几年后突然停止工作时,他能打电话给你调试吗? :)
        • @Heinzi: GetHashCode 不保证这样的事情!事实上,你很可能会发生碰撞。这是生日问题,只是日历中有更多的日子。使用2^32 存储桶,只需大约 75000 个字符串就有大于 0.5 的碰撞机会。
        • 唯一性的“高概率”是一种错觉。我发现在对字符串进行哈希处理时,在生成大约 70,000 个字符串后,发生冲突的可能性为 50%。我从来没有发现我可以插入 200,000 个字符串而不会生成重复的情况。这适用于真实世界的数据以及我在过去 15 年编写的多个应用程序中随机生成的测试数据。
        猜你喜欢
        • 2012-03-23
        • 2013-11-20
        • 2017-04-04
        • 2016-07-06
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多