【问题标题】:Generate an rgb color from a user's name (in a repeatable way)从用户名生成 rgb 颜色(以可重复的方式)
【发布时间】:2016-10-19 18:01:38
【问题描述】:

我想根据以下规则为用户的默认头像背景设置一致的颜色:

  • rgb值,其中每个数字不能大于200(即0到200之间)
  • 使用全名,例如“John Smith”和“John Smithy”会给出不同的颜色。
  • 对名称稍作改动就会产生完全不同的颜色。

我正在考虑这些方面的一些事情:

  • 将名称散列成由三个相等部分组成的东西
  • 获取三个部分中的每一个并将其标准化为 0 到 1 之间的浮点数
  • 将这些乘以 200 得到 r、g 或 b 值。

但我不知道该怎么做。有什么建议么?如果我能在没有获得任何额外宝石的情况下做到这一点,那将是理想的。我已经将 MD5 用于一些哈希值。

注意:这不是一个安全问题,只是有点好玩,所以如果两个不同的名字偶尔会产生相同的颜色,这并不重要,但通常最好使颜色值尽可能多变。

【问题讨论】:

    标签: ruby hash rgbcolor


    【解决方案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]
    

    【讨论】:

    • 这正是我几年前所做的。不幸的是,我的经理的名字被映射到他不喜欢的颜色(我认为是粉红色或浅橙色)。我不得不在那里引入一个常数,以影响映射:)
    • 我正在使用与颜色标签类似的方法。但我使用的不是随机 RGB 值,而是具有完全随机色调的 HSL,并且亮度和饱和度的变化有限。这样可以提供更一致的颜色。
    • @Stefan 这是个好主意,我可能会这样做,谢谢。
    • 你对 l & s btw 有什么变化?
    • @MaxWilliams 它们现在实际上是固定值,具体取决于标签的类型。我有hsl(x, 45%, 50%) 的饱和颜色范围和hsl(x, 65%, 90%) 的柔和颜色范围。
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多