14

我的应用程序中有一个操作日志表。我想根据该条目的 sessionID 为行分配随机颜色,以帮助查看模式/分组操作。

到目前为止我有这个:

console.log(stringToColorCode('mj3bPTCbIAVoNr93me1I'));

function stringToColorCode(str) {
    return '#'+ ('000000' + (Math.random()*0xFFFFFF<<0).toString(16)).slice(-6);
}

但是我需要用我的字符串整数替换 Math.random(),是否有任何技术可以将字符串转换为与随机字符串保持一致的随机数?

4

4 回答 4

18

根据要求,将此作为 awswer 发布

var stringHexNumber = (                       // 1
    parseInt(                                 // 2
        parseInt('mj3bPTCbIAVoNr93me1I', 36)  // 3
            .toExponential()                  // 4
            .slice(2,-5)                      // 5
    , 10) & 0xFFFFFF                          // 6
).toString(16).toUpperCase(); // "32EF01"     // 7

发生什么了?

  1. 事情从转换为Integer3开始,例如,通过将其解释为 base-36 数字。 'mj3bPTCbIAVoNr93me1I'x
  2. 接下来,将其作为String on linex放入指数形式。这是因为有这么多字符,可能会很大,这个例子就在身边,所以把它转换成一个非常标准的形式。 4x8e30
  3. 在此之后,行5修剪开头和结尾,因此您将只剩下数字,例如'8.123e+30'.slice(2, -5)变为'12'.
  4. 现在我们回到 line 2,它再次转换回Integer,这次是以 10 为底。
  5. 然后, line使用快速按位AND6将此数字截断到范围内。这也将转换为.0..16777215 (=== 0xFFFFFF)NaN0
  6. 最后,line通过在 base 中写入数字并更改大小写,7将其转换回我们习惯于查看颜色的大写十六进制格式。16

如果您想使用它,您可能还需要确保最终数字是6数字并在前面粘贴 a #,这可以通过

'#' + ('000000' + stringHexNumber).slice(-6); // "#32EF01"
于 2013-07-25T00:14:22.777 回答
10
var color_codes = {};
function stringToColorCode(str) {
    return (str in color_codes) ? color_codes[str] : (color_codes[str] = '#'+ ('000000' + (Math.random()*0xFFFFFF<<0).toString(16)).slice(-6));
}
于 2013-07-24T22:05:37.997 回答
2

甜蜜的问题。我所做的是创建一个全局变量,这样您就可以始终如一地为给定的输入字符串获得相同的颜色。一旦您调用了 stringToColorCode,它只会为该字符串生成一次随机颜色。您可以依靠它来保持一致,这样如果您使用相同的字符串背靠背调用该函数,它将返回相同的随机颜色。我看到的唯一缺陷是可能(但不太可能)两个不同的字符串可以映射到相同的颜色,但如果有必要可以解决这个问题。

编辑:第一次回答时,我没有意识到@Nirk 的答案几乎相同。为了使这个更加独特,使用它可以在页面重新加载时为您提供一致的颜色。

console.log(stringToColorCode('mj3bPTCbIAVoNr93me1I'));

function stringToColorCode(str) {
    var sessionStoreKey = "myStringColors" + str;
    if (!sessionStorage[sessionStoreKey ]) {
        sessionStorage[sessionStoreKey] = Math.random()*0xFFFFFF<<0;       
    }

    var randomColor = sessionStorage[sessionStoreKey];

    return '#'+ randomColor;
}
于 2013-07-24T22:16:06.847 回答
-1

我在支持 bean 上解决了这个问题。这在 Java 中对我有用:

private void createDefaultColorFromName(final String name) {
    String md5 = "#" + md5(name).substring(0, 6);
    defaultColor = Color.decode(md5);
    int darkness = ((defaultColor.getRed() * 299) + (defaultColor.getGreen() * 587) + (defaultColor.getBlue() * 114)) / 1000;
    if (darkness > 125) {
        defaultColor = defaultColor.darker();
    }
}

对于白色背景,我使生成的颜色更暗...

于 2014-12-17T08:54:24.617 回答