将随机字符串转换为十六进制颜色

时间:2013-07-24 22:03:25

标签: javascript

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

到目前为止,我有这个:

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

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

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

4 个答案:

答案 0 :(得分:16)

As requested,将其发布为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. 事情从3开始,其中'mj3bPTCbIAVoNr93me1I'转换为整数,比如x,将其解释为基数为36的数字。
  2. 接下来,x作为 String 4行上以指数形式放入其中。这是因为有了这么多字符,x可以巨大,这个例子大约是8e30,所以将它转换为非常标准的形式。
  3. 在此之后,行5会修剪开头和结尾,这样您就可以只使用数字,例如'8.123e+30'.slice(2, -5)变为'12'
  4. 现在我们回到2行,再次将其转换回 Integer ,这次是在10号基地。
  5. 然后,行6使用快速按位 AND 将此数字截断到范围0..16777215 (=== 0xFFFFFF)。这也会将NaN转换为0
  6. 最后,第7行将其转换回大写十六进制格式,我们习惯通过在基础16中编写数字并更改案例来查看颜色。
  7. 如果您想使用此功能,您可能还需要确保最终的数字是6位数并在前面粘贴#,这可以通过

    完成
    '#' + ('000000' + stringHexNumber).slice(-6); // "#32EF01"
    

答案 1 :(得分:11)

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));
}

答案 2 :(得分:2)

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

编辑:第一次回答时,我没有意识到@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;
}

答案 3 :(得分:-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();
    }
}

我为白色背景生成的颜色有点暗......