在我的网络应用程序中,我有一个聊天室。我希望每个用户的名字都有不同的颜色,而不是全黑。实现这一目标的最佳方法是什么?我是否应该在每个用户注册我的应用程序时存储他们的 RGB/HEX 代码并将该字符串作为字段作为他们在数据库中记录的一部分?
4 回答
我有一个固定的颜色列表,让用户从中挑选并在数据库中存储一个索引1 = red
,2 = green
等等。这将允许您更改每种颜色的阴影以匹配您的网站设计,因为它正在发展。
例如,您可能希望“红色”与您的徽标匹配相同的红色;如果您将其作为 RGB 值存储在数据库中,而不仅仅是“红色”,则更改将更加困难。
如果您的目标是让用户在聊天室中一目了然,这取决于您的用户群有多大。如果聊天室的平均大小是 10 人,但您的用户群有数千人,那么为每个人设置唯一的颜色是行不通的。最终,您最终会在同一个聊天室中出现相同颜色的稍微不同的阴影。
在这种情况下,只需保留一个明显不同颜色的简短列表,然后在单个聊天室中分配它们。
作为您的方案的替代方案:
您可以像 irssi(和其他人一样)那样做,只需根据屏幕昵称的散列(使用您选择的函数)分配颜色。在这个系统下,昵称的长度和颜色(应该/将)是不相关的,所以不同的字母、不同的网名和不同的颜色的组合应该足以使事物既可区分,又在会话之间保持一致。在此方案中,您可能需要缓存的唯一内容是作为会话中每个用户名的颜色,因此您不必进行无数次 md5 调用。这并不能保证每个用户都有不同的颜色(远非如此),也许您应该考虑一下您尝试使用该规范实现的目的。
特别是使用色调值从 HSV/HSL 生成颜色。然后转换为RGB。
您可能每次都想要尽可能不同的颜色。
您可以通过保留一系列颜色范围来做到这一点。
如果队列为空,则返回色调 0 并将对 (0, 360) 插入队列。下次您想要颜色时,从队列 (0, 360) 中弹出一个元素,并返回这些值之间的中点:180。然后将 (0, 180) 和 (180, 360) 推入队列。
下次你想要一个颜色时,从队列 (0, 180) 中弹出一个元素,并返回这些值之间的中点:90。然后将 (0, 90) 和 (90, 180) 推入队列。
下次您想要颜色时,从队列 (180, 360) 中弹出一个元素,并返回这些值之间的中点:270。然后将 (180, 270) 和 (270, 360) 推入队列。
继续这个过程...
您将自动为每个用户拥有最广泛的可区分颜色。