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

Tit*_*tan 14 javascript

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

到目前为止我有这个:

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

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

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

Pau*_* S. 17

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

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

发生什么了?

  1. 事情开始上线3,其中'mj3bPTCbIAVoNr93me1I'被转换成一个整数,比方说x,通过将其解释为碱-36号.
  2. 接下来,x将其作为String的指数形式放在行上4.这是因为有很多字符,x可能是巨大的,这个例子是围绕的8e30,所以将它转换为非常标准的形式.
  3. 在此之后,线条会5在开始和结束时进行修剪,因此您只需要数字,例如'8.123e+30'.slice(2, -5)变为数字'12'.
  4. 现在我们回到行2,这将再次转换回整数,这次是在10.
  5. 然后,line 使用快速按位AND6将此数字截断到该范围.这也将转换为.0..16777215 (=== 0xFFFFFF)NaN0
  6. 最后,行将其7转换回大写十六进制格式,我们习惯于通过在底部写入数字16并更改大小写来查看颜色.

如果你想使用它,你可能还想确保最终的数字是6数字并且#在前面粘贴一个,这可以通过

'#' + ('000000' + stringHexNumber).slice(-6); // "#32EF01"
Run Code Online (Sandbox Code Playgroud)

  • 几个澄清我们没有立即跳到这个有趣的结论:).我了解到base-36有一个名字:hexatridecimal系统.这是一种特殊情况,因为它可以很容易地用0-9A-Z表示,因此parseInt(sessionID,36) - 假设sessionID是字母数字.在调用toExponential()之后,完成切片(2,-5).从2开始越过第一个小数点,从结尾到-5结束,因为指数可能有5个字符 - 最大值是e + 307,之后,toExponential()返回Infinity. (2认同)

She*_*tJS 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));
}
Run Code Online (Sandbox Code Playgroud)

  • 这很好用,但不能在页面重新加载.每次加载页面时都会有所不同.问题没有说明是否需要在负载上保持一致,因此这可能适用于提问者的需求. (7认同)