Создать цвет RGB из имени пользователя (повторяемым образом)
Я хотел бы установить постоянный цвет фона аватара пользователя по умолчанию в соответствии со следующими правилами:
- значение rgb, где каждое число не может быть больше 200 (то есть от 0 до 200)
- используйте полное имя, например, "Джон Смит" и "Джон Смити" дадут разные цвета.
- Небольшое изменение названия должно создать совершенно другой цвет.
Я думаю о чем-то вроде этого:
- хэш имя в нечто, что состоит из трех равных частей
- возьмите каждую из трех частей и нормализуйте ее до числа от 0 до 1
- умножьте их на 200, чтобы получить значение r, g или b.
Но я не могу понять, как это сделать. Какие-либо предложения? Если бы я мог сделать это без каких-либо дополнительных драгоценных камней, это было бы идеально. Я уже использую MD5 для некоторых вещей хэширования.
ПРИМЕЧАНИЕ: это не проблема безопасности, это просто забавно, поэтому, если два разных имени время от времени генерируют один и тот же цвет, это не имеет большого значения, но, как правило, было бы неплохо иметь цвет значения настолько разнообразны, насколько это возможно.
1 ответ
Вы можете создать 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]