我的应用程序中有一个操作日志表。我想根据该条目的sessionID为行分配一个随机颜色,以帮助查看模式/分组操作。
到目前为止,我有这个:
console.log(stringToColorCode('mj3bPTCbIAVoNr93me1I'));
function stringToColorCode(str) {
return '#'+ ('000000' + (Math.random()*0xFFFFFF<<0).toString(16)).slice(-6);
}
但是我需要用我的字符串整数替换Math.random(),是否有任何将字符串转换为与随机字符串保持一致的随机数的技术?
答案 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
那么,发生了什么?
3
开始,其中'mj3bPTCbIAVoNr93me1I'
转换为整数,比如x
,将其解释为基数为36的数字。 x
作为 String 在4
行上以指数形式放入其中。这是因为有了这么多字符,x
可以巨大,这个例子大约是8e30
,所以将它转换为非常标准的形式。 5
会修剪开头和结尾,这样您就可以只使用数字,例如'8.123e+30'.slice(2, -5)
变为'12'
。2
行,再次将其转换回 Integer ,这次是在10号基地。6
使用快速按位 AND 将此数字截断到范围0..16777215 (=== 0xFFFFFF)
。这也会将NaN
转换为0
。7
行将其转换回大写十六进制格式,我们习惯通过在基础16
中编写数字并更改案例来查看颜色。如果您想使用此功能,您可能还需要确保最终的数字是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();
}
}
我为白色背景生成的颜色有点暗......