Создать цвет 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]
Другие вопросы по тегам