【问题标题】:how can i hash strings into a specific number of buckets我如何将字符串散列到特定数量的桶中
【发布时间】:2011-03-23 23:05:57
【问题描述】:

我正在尝试提出一种算法,将字符串散列到特定数量的存储桶中,但没有任何运气想出如何做到这一点的想法?

我有一个这样的字符串列表:

a.jpg
b.htm
c.gif
d.jpg
e.swf

我想运行一个函数来根据字符串获取 1 到 4 之间的数字。

例如a.jpg 将是 3
b.htm 将是 2
c.gif 将是 1
等等

它需要保持一致,所以如果我在 a.jpg 上运行该函数,它总是返回 3。

此算法将用于在服务器之间分配资源...

例如a.jpg 将从 server3.mydomain.com
访问 b.htm 将从 server2.mydomain.com
访问 等等

有人知道我会怎么做吗?

任何建议将不胜感激!

干杯

提姆

【问题讨论】:

  • 以下建议使用GetHashCode 的所有解决方案都已被彻底破坏。见stackoverflow.com/questions/5154970/…。如果您的服务器运行不同版本的 .NET,它们可能会计算不同的哈希值。如果您想要保证,请实现您自己的哈希函数。
  • 谢谢,你说得对,这是一个问题,因为我需要哈希值保持一致。您发布的链接中 jon skeet 的答案中的哈希函数看起来可以正常工作。

标签: c# hash bucket


【解决方案1】:

您可能会发现following blog post 很有用。提出的算法是:

int bucketIndex = (int)((uint)"d.jpg".GetHashCode() % (uint)buckets.Length);

【讨论】:

  • 你需要加 1(因为 OP 想要一个介于 1 和 buckets 之间的值)
  • @Thomas Levesque,建议的算法来自我在回答中链接到的博客文章。在其中作者使用它作为索引,所以它是基于 0 的。我不想修改它以保留原始想法。 OP 可以根据他的需要进行调整。
  • GetHashCode() 在过去、现在和未来的所有 .NET 框架版本中是一致的实现吗?根据参与此过程的人员,您可能希望使用明确的已知哈希算法。
【解决方案2】:
int bucket = (int)(unchecked(((uint)s.GetHashCode())) % 4 + 1)

(其中s 是字符串)

【讨论】:

    【解决方案3】:

    标准 GetHashCode 和 % 将起作用:Math.Abs("aaaa".GetHashCode()) % numberOfBuckets

    编辑感谢 Thomas Levesque 提醒 GetHashCode() 返回

    【讨论】:

    • 这正是我所追求的,但我刚刚在 1000 个字符串上运行代码并注意到它确实返回了一些负值。有没有快速解决方法?
    • 如果GetHashCode 返回int.MinValue,这将失败,因为Math.Abs(int.MinValue) 将抛出OverflowException
    【解决方案4】:

    使用基于共享机器密钥的哈希算法。这将为每个字符串创建一个唯一标识符。如果您需要整数,则使用字典对象将字符串映射到整数。每次添加新字符串时,将其键设置为当前字典长度。最后将字典存储在基于场的状态对象中,例如共享会话,以便每个站点实例都可以引用它。

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 1970-01-01
      • 2021-01-08
      • 2017-02-07
      • 1970-01-01
      • 2015-01-17
      • 2022-11-30
      • 2010-09-15
      • 2021-12-21
      相关资源
      最近更新 更多