将字符串哈希变为RGB颜色

Jen*_*ohl 46 language-agnostic hash colors

有关如何将任意字符串散列为RGB颜色值的最佳实践吗?或者更一般:3个字节.

你问:我什么时候需要这个?这对我来说无关紧要,但想象一下任何GitHub 网页上的管图.在那里你可以看到这样的东西:

git branches

每条彩色线都代表一个独特的git分支.为这些分支着色的低技术方法是CLUT(颜色查找表).更复杂的版本是:

$branchColor = hashStringToColor(concat($username,$branchname));
Run Code Online (Sandbox Code Playgroud)

因为每次看到分支表示时都需要静态颜色.而对于奖励积分:您如何确保该哈希函数的均匀颜色分布?

所以我的问题的答案归结为实施hashStringToColor().

Jef*_*ter 30

良好的散列函数将在密钥空间上提供接近均匀的分布.这减少了如何将随机32位数转换为3字节RGB空间的问题.我认为只需要低3字节就没有错.

int hash = string.getHashCode();
int r = (hash & 0xFF0000) >> 16;
int g = (hash & 0x00FF00) >> 8;
int b = hash & 0x0000FF;
Run Code Online (Sandbox Code Playgroud)

  • 虽然如果你想确保可读的颜色(例如确保足够高的对比度和饱和度),你将不得不做更多的工作.可能更容易在HSV或LAB中工作,并转换为RGB. (10认同)

cla*_*mk1 25

对于那里的任何Javascript用户,我将@ jeff-foster的接受答案与erlycoder的djb2哈希函数结合起来.

每个问题的结果:

function djb2(str){
  var hash = 5381;
  for (var i = 0; i < str.length; i++) {
    hash = ((hash << 5) + hash) + str.charCodeAt(i); /* hash * 33 + c */
  }
  return hash;
}

function hashStringToColor(str) {
  var hash = djb2(str);
  var r = (hash & 0xFF0000) >> 16;
  var g = (hash & 0x00FF00) >> 8;
  var b = hash & 0x0000FF;
  return "#" + ("0" + r.toString(16)).substr(-2) + ("0" + g.toString(16)).substr(-2) + ("0" + b.toString(16)).substr(-2);
}
Run Code Online (Sandbox Code Playgroud)

更新:修复了返回字符串,以便始终根据@alexc的编辑返回#000000格式的十六进制字符串(谢谢!).

  • 您也可以这样格式化颜色:返回"rgb("+ r +","+ g +","+ b +")" (4认同)
  • @StuGla:我不记得十六进制格式是否是要求的一部分;现在阅读它似乎不是。由于问题是一般性的问题,我认为作者对哈希算法的兴趣比对颜色字符串格式的兴趣更大。但是,如果问题的上下文是CSS,则使用CSS的方法会更简洁。干杯,谢谢! (2认同)

R.J*_*.J. 10

我尝试了其他人提供的所有解决方案,但发现类似的字符串(string1 vs string2)产生的颜色与我的喜好太相似.因此,我建立了自己受其他人的投入和想法的影响.

这个将计算字符串的MD5校验和,并取前6个十六进制数字来定义RGB 24位代码.

MD5功能是一个开源的JQuery插件.JS函数如下:

function getRGB(str) {
    return '#' + $.md5(str).substring(0, 6);
}
Run Code Online (Sandbox Code Playgroud)

这个工作示例的链接在jsFiddle上.只需在输入字段中输入一个字符串并按Enter键,然后一遍又一遍地比较您的发现.


Zen*_*eng 7

我只是构建一个名为color-hash的JavaScript库,它可以根据给定的字符串生成颜色(使用HSL颜色空间和BKDRHash).

回复:https://github.com/zenozeng/color-hash
演示:https://zenozeng.github.io/color-hash/demo/