2014-07-08 46 views
0

我想從數組中提取一個元素,可預測基於字符串輸入。基於Ruby中的散列字符串從數組中獲取項目

我的用例:根據名稱爲用戶生成一種顏色。

一個(故障)的實施方法是生成從用戶名的散列,並且將其降低到一個值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

您最多可以添加字符串中的每個字符的順序值,然後除以國防部25這樣的:

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

我一直在使用「&」的思想,這是像吸盤一樣的divmod運算符!謝謝。 :) –

+0

使用'字節'像@theTRON建議下面使這個小清潔:'顏色[name.bytes.reduce(:+)%25]' – bundacia

2

您所使用的#bytes大廈,你也可以去的東西,如:

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

謝謝!只是好奇,爲什麼.inject(:+)而不是.sum? –

+2

@RichardJohansson上次檢查時'Array'沒有內置的sum方法。看起來Rails確實如此([文檔](http://api.rubyonrails.org/classes/Enumerable.html#method-i-sum)) –

+0

啊,謝謝。當他們感覺自然的Ruby時,不知道什麼框架有時會添加什麼方法... –

相關問題