从用户名生成 rgb 颜色(以可重复的方式)
Generate an rgb color from a user's name (in a repeatable way)
我想根据以下规则为用户的默认头像背景设置一致的颜色:
- rgb值,其中每个数字不能大于200(即0到200之间)
- 使用全名,例如"John Smith"和"John Smithy"会给出不同的颜色。
- 对名称稍作改动就会产生完全不同的颜色。
我正在考虑以下思路:
- 将名称散列为由三个相等部分组成的东西
- 取三个部分中的每一个并将其标准化为介于 0 和 1 之间的浮点数
- 将这些乘以 200 得到 r、g 或 b 值。
但我不太清楚该怎么做。有什么建议么?如果我能在不获得任何额外宝石的情况下做到这一点,那将是理想的。我已经使用 MD5 进行一些哈希处理。
注意:这不是安全问题,只是有点好玩,所以如果两个不同的名称偶尔会生成相同的颜色,这无关紧要,但通常情况下很高兴让颜色值尽可能多变。
您可以通过以下方式构建用户名的 MD5 哈希:
require 'digest'
name = 'foo'
digest = Digest::MD5.digest(name)
#=> "\xAC\xBD\x18\xDBL\xC2\xF8\\xED\xEFeO\xCC\xC4\xA4\xD8"
提取前三个 16 位整数:
values = digest.unpack('SSS')
#=> [48556, 56088, 49740]
并将这些 0..65535 值映射到 0..200:
values.map { |i| i * 201 / 0x10000 }
#=> [148, 172, 152]
我想根据以下规则为用户的默认头像背景设置一致的颜色:
- rgb值,其中每个数字不能大于200(即0到200之间)
- 使用全名,例如"John Smith"和"John Smithy"会给出不同的颜色。
- 对名称稍作改动就会产生完全不同的颜色。
我正在考虑以下思路:
- 将名称散列为由三个相等部分组成的东西
- 取三个部分中的每一个并将其标准化为介于 0 和 1 之间的浮点数
- 将这些乘以 200 得到 r、g 或 b 值。
但我不太清楚该怎么做。有什么建议么?如果我能在不获得任何额外宝石的情况下做到这一点,那将是理想的。我已经使用 MD5 进行一些哈希处理。
注意:这不是安全问题,只是有点好玩,所以如果两个不同的名称偶尔会生成相同的颜色,这无关紧要,但通常情况下很高兴让颜色值尽可能多变。
您可以通过以下方式构建用户名的 MD5 哈希:
require 'digest'
name = 'foo'
digest = Digest::MD5.digest(name)
#=> "\xAC\xBD\x18\xDBL\xC2\xF8\\xED\xEFeO\xCC\xC4\xA4\xD8"
提取前三个 16 位整数:
values = digest.unpack('SSS')
#=> [48556, 56088, 49740]
并将这些 0..65535 值映射到 0..200:
values.map { |i| i * 201 / 0x10000 }
#=> [148, 172, 152]