将随机字符串转换为十六进制颜色
Converting a random string into a hex colour
我的应用程序中有一个操作日志表。我想根据该条目的sessionID为行分配一种随机颜色,以帮助查看模式/分组操作。
到目前为止,我有这个:
console.log(stringToColorCode('mj3bPTCbIAVoNr93me1I'));
function stringToColorCode(str) {
return '#'+ ('000000' + (Math.random()*0xFFFFFF<<0).toString(16)).slice(-6);
}
然而,我需要将Math.random()替换为字符串整数,有没有任何技术可以将字符串转换为与随机字符串保持一致的随机数?
根据请求,将其作为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
被放入它的指数形式,作为4
线上的String。这是因为有了这么多字符,x
可以是巨大的,这个例子是关于8e30
的,所以将其转换为一种非常标准的形式 - 之后,第
5
行去掉了开头和结尾,所以只剩下数字,例如'8.123e+30'.slice(2, -5)
变成了'12'
- 现在我们回到第
2
行,在那里它再次被转换回整数,这次是以10为基数 - 然后,行
6
使用快速位AND将该数字截断到范围0..16777215 (=== 0xFFFFFF)
。这也将把NaN
转换为0
- 最后,第
7
行通过在16
中写入数字并更改大小写,将其转换回我们习惯于在中看到颜色的大写十六进制格式
如果你想使用这个,你可能还想确保最后的数字是6
数字,并在前面粘贴一个#
,这可以通过完成
'#' + ('000000' + stringHexNumber).slice(-6); // "#32EF01"
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));
}
甜蜜的问题。我所做的是创建一个全局变量,这样你就可以一致地为给定的输入字符串获得相同的颜色。一旦调用了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;
}
我在backingbean上解决了这个问题。这在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();
}
}
我为白色背景使生成的颜色稍微暗一点。。。
相关文章:
- 如何检查十六进制颜色是否为“”;太黑”;
- javascript:搜索并用不同的颜色代码替换十六进制颜色代码
- html5画布支持带alpha的十六进制颜色吗
- 以递增的渐变对十六进制颜色代码进行排序
- 如何将透明度信息添加到十六进制颜色代码
- 如何在 jquery 颜色选择器中设置数字十六进制颜色
- 有没有一行 javascript 可以将每个十六进制颜色更改为不同的十六进制颜色
- Regexp匹配十六进制颜色语法(和缩写形式)
- Javascript解析页面以查找十六进制颜色值
- 如何在Javascript中用十六进制颜色为字符串着色
- 使用javascript匹配功能捕获十六进制颜色代码
- 将随机字符串转换为十六进制颜色
- 将数组十六进制颜色转换为数组rgb颜色
- 将十六进制颜色传递到函数时,firefox中存在非法字符
- 在Javascript Regex中,如何验证字符串是否为有效的十六进制颜色
- 根据十六进制颜色获取最接近的颜色名称
- 生成一个随机的种子十六进制颜色
- 将照度转换为十六进制颜色
- 使十六进制颜色变亮或变暗
- 十六进制颜色码的按位补码总是返回6个字符吗?