在Ruby中基于散列字符串从数组中获取项目

时间:2014-07-08 13:32:19

标签: ruby arrays hash type-conversion digest

我想从数组中提取一个元素,可以预测基于字符串输入。

我的使用案例:根据名称为用户生成颜色。

一个(错误的)实现是从用户名生成哈希值,并将其减少到0-25之间的值,如下所示:

def color
  colors = array_of_25_colors
  colors[Digest::MD5.hexdigest(name).to_i(16) & 25]
end

此实现仅返回8种可能的颜色,因此没有好处。

修改

我尝试的另一个实现是使用名称中第一个字符的字节代码,但由于我在名称中允许使用unicode,这是不切实际的:

"aaron".first.bytes.first - 97
=> 0 #Okay!
"zac".first.bytes.first - 97
=> 25 #Nice!
"örjan".first.bytes.first - 97
=> 98 #Doh!

工作实现可能是什么样的?

2 个答案:

答案 0 :(得分:2)

您可以将字符串中每个字符的序数值相加,然后将mod 25除以:

colors = array_of_25_colors
colors[name.bytes.reduce(:+) % 25]

答案 1 :(得分:2)

在您使用#bytes的基础上,您还可以使用以下内容:

colors[name.bytes.inject(:+) % 25]