将字符串一致地映射到数组索引(散列函数)

时间:2014-06-30 19:26:45

标签: ruby arrays hash

我有一个数组:

a = [1,2,3,4,5]

给定任何字符串“blah”或“whee”,我希望始终返回从数组中返回值:

myfunc("blah")  -> 1
myfunc("whee")  -> 2
myfunc("three") -> 3
myfunc("blah")  -> 1

有什么建议吗?我正在使用ruby,但任何伪代码都可以。该字符串实际上是URL,所以我不知道提前的可能性。

数量有限,但可能接近50,000,所以最好避免存储每一个。

我想要一个大致随机的分布,但如果它是偏斜的,或者一个元素非常罕见,那就没问题了。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要从数组中返回任何字符串的项目,你不关心什么项目,但是你希望它每次都一样。

如果是这样,您可以使用hash方法:

def myfunc(obj)
  a = [1,2,3,4,5]
  a[obj.hash % a.size]
end
myfunc("blah")  -> 5
myfunc("whee")  -> 4
myfunc("three") -> 2
myfunc("blah")  -> 5

答案 1 :(得分:1)

我认为你正朝着正确的方向前进。

my_array = [1,2,3,4,5]

"whee".split('').collect {|c| c.ord}.inject{|sum, x| sum + x} % my_array.size

使用它,您总是将字符串映射到数组中的索引。

此外,代替1,2,3,4 ...您可以使用数组中的任何唯一随机数进行相同的关联,因为mod操作数返回索引,而不是值。