我正在尝试提出一种算法来将字符串哈希到特定数量的存储桶中但是还没有任何关于如何做到这一点的想法?
我有一个像这样的字符串列表:
A.JPG
b.htm
c.gif
D.JPG
e.swf
我想运行一个函数来根据字符串得到1到4之间的数字。
e.g。 a.jpg将是3
b.htm将是2
c.gif将是1
等
它需要保持一致,所以如果我在a.jpg上运行该函数,它总是返回3.
此算法用于在服务器之间分割资源......
e.g。 a.jpg将从server3.mydomain.com进行访问
b.htm将从server2.mydomain.com进行访问
等
有谁知道我会怎么做呢?
非常感谢任何建议!
干杯
添
答案 0 :(得分:3)
您可能会发现following blog post很有用。提出的算法是:
int bucketIndex = (int)((uint)"d.jpg".GetHashCode() % (uint)buckets.Length);
答案 1 :(得分:2)
int bucket = (int)(unchecked(((uint)s.GetHashCode())) % 4 + 1)
(其中s
是字符串)
答案 2 :(得分:1)
标准GetHashCode和%将起作用:Math.Abs("aaaa".GetHashCode()) % numberOfBuckets
。
编辑感谢Thomas Levesque提醒GetHashCode()返回< 0.添加Math.Abs以获得正确的代码,但其他答案中的版本可能更好。
答案 3 :(得分:-1)
使用基于共享计算机密钥的哈希算法。这将为每个字符串创建一个唯一标识符。如果需要整数,则使用字典对象将字符串映射到整数。每次添加新字符串时,都将其键设置为当前字典长度。最后,将字典存储在基于场的状态对象(如共享会话)中,以便每个站点实例都可以引用它。