我想从数组中提取一个元素,可以预测基于字符串输入。
我的使用案例:根据名称为用户生成颜色。
一个(错误的)实现是从用户名生成哈希值,并将其减少到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!
工作实现可能是什么样的?
答案 0 :(得分:2)
您可以将字符串中每个字符的序数值相加,然后将mod 25除以:
colors = array_of_25_colors
colors[name.bytes.reduce(:+) % 25]
答案 1 :(得分:2)
在您使用#bytes
的基础上,您还可以使用以下内容:
colors[name.bytes.inject(:+) % 25]