2016-10-19 18 views
1

我想設置一個一致的顏色爲用戶的默認頭像的背景下,根據以下規則:生成一個用戶名的RGB顏色(可重複的方式)

  • RGB值,其中每個數字不能高於200(即在0和200之間)
  • 使用全名,例如「John Smith」和「John Smithy」會給出不同的顏色。
  • 名稱的小改動應該會創建完全不同的顏色。

我想的東西沿着這些路線:

  • 哈希名字弄成它由三個相等的部分
  • 把每三個部分,並將其標準化至0之間的浮動和1
  • 將這些乘以200得到r,g或b值。

但我不能完全弄清楚如何去做。有什麼建議麼?如果我能夠做到這一點,不會得到任何理想的額外寶石。我已經使用MD5來處理一些散列問題。

注意:這不是一個安全問題,它只是一個有趣的,所以如果兩個不同的名稱最終產生相同的顏色一次,它並不重要,但通常它會很好使顏色值儘可能變化。

回答

3

你可以通過建立用戶名的MD5哈希:

require 'digest' 

name = 'foo' 
digest = Digest::MD5.digest(name) 
#=> "\xAC\xBD\x18\xDBL\xC2\xF8\\\xED\xEFeO\xCC\xC4\xA4\xD8" 

提取前3個16位整數:

values = digest.unpack('SSS') 
#=> [48556, 56088, 49740] 

而且這些0..65535值映射到0 ..200:

values.map { |i| i * 201/0x10000 } 
#=> [148, 172, 152] 
+2

這正是我幾年前所做的。不幸的是,我的經理名字被映射爲他不喜歡的顏色(我認爲它是粉紅色或淺橙色)。我不得不在那裏引入一個常量,以影響映射:) –

+0

我正在使用類似的方法來處理顏色標籤。但不是隨機的RGB值,我使用HSL的顏色完全隨機,亮度和飽和度只有有限的變化。這給出更一致的顏色。 – Stefan

+0

@Stefan這是個好主意,我可以這樣做,謝謝。 –