将字符串哈希变为RGB颜色

时间:2012-06-20 13:35:43

标签: hash colors language-agnostic

是否有关于如何将任意字符串散列为RGB颜色值的最佳做法?或者更一般:到3个字节。

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

git branches

每条彩色线都表示不同的git分支。为这些分支着色的低技术方法是CLUT(颜色查找表)。更复杂的版本是:

$branchColor = hashStringToColor(concat($username,$branchname));

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

因此,我的问题的答案归结为hashStringToColor()的实施。

5 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:24)

对于那里的任何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);
}

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

答案 2 :(得分:9)

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

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

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

function getRGB(str){
    var hash = $.md5(str);
    var rgb = '#' + hash.substring(0,2) + hash.substring(2,4) + hash.substring(4,6);
    return rgb;
}

此工作示例的链接位于jsFiddle。只需在输入字段中输入一个字符串并按Enter键,然后反复进行以比较您的发现。

答案 3 :(得分:6)

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

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

答案 4 :(得分:2)

例如,this is how Java calculates the hashcode of a string(第1494行及以下)。它返回int。然后,您可以使用16,777,216(2 ^ 24 = 3个字节)计算int的模数,以获得“RGB兼容”数字。

这是一个确定性计算,因此相同的单词将始终具有相同的颜色。哈希冲突的可能性(2个具有相同颜色的字符串)很小。不确定颜色分布,但可能相当随机。

相关问题