0

目前,我正在使用 scriptish 编写一个小脚本,该脚本接受用户 ID(目前在我们的论坛上,我们的用户 ID 从 1 到 63)并使用以下函数用随机颜色对其进行着色:

function setNickColor(nick) 
var spans = nick.getElementsByTagName('span');
var uid = nick.getAttribute('hovercard-id');

if (colors[uid] == null)
    storeColor(uid, Math.random().toString(15).substring(2,8));

这给了我一个 24 位(用于 rgb 颜色)的随机颜色,为每个安装脚本的人单独生成。我想让每个 ID 生成一个固定的随机颜色。我不明白如何将 ID 应用到函数中,以便它仍然是随机的,但仍然会生成随机颜色。

我查看了种子,但有点难以理解它们的作用,因为我对 javascript 很陌生

4

2 回答 2

0

“固定”和“随机”是两个完全相反的东西。忘记随机。根据您的描述,您真的只是想要“固定”。

现在寻求解决方案:获取 ID 的任意散列,然后将其减少到仅 3 个字节以形成与该 ID 对应的 RGB 值。

于 2013-03-04T10:53:11.503 回答
0

在我看来,您的解决方案有两个主要组成部分:

  1. 为用户 ID 生成随机颜色。
  2. 将此随机颜色与后续请求中的用户 ID 相关联。

既然你已经完成了第一个,那就留下第二个。以下是一些选项,具体取决于后端系统为您提供的灵活性:

  1. 您可以编写一个网络服务,从您的 javascript 函数中调用它。您调用的有效负载将是用户 ID 和生成的颜色,您的 Web 服务将存储在后端数据库中。如果未设置颜色,您的模板将检查每个用户,生成一个随机颜色并设置它(并刷新页面,以进行初始设置)。

  2. 您可以在浏览器中设置一个代表您生成的颜色的 cookie,然后加载此 cookie 并使用它来更改正在显示的用户 ID。这样做的缺点是它依赖于浏览器(在同一台机器上,在两个浏览器上,同一个用户 ID 可以有两种不同的颜色),如果这个人清除了他们的 cookie,颜色将被重新生成。

  3. 第三个选项是 Oleg 建议的 - 创建用户 ID 的一些散列(它是一种单向算法,因此可以保证在相同输入的情况下得到相同的结果),然后将此散列的一个组成部分作为颜色的基础。好处是您避免了 cookie 和网络服务问题;但挑战是您需要使颜色生成器更加“随机”,因为您最终可能会得到视觉上不那么明显的颜色。

于 2013-03-04T11:00:33.667 回答