Hash 将字符串散列为RGB颜色

Hash 将字符串散列为RGB颜色,hash,colors,language-agnostic,Hash,Colors,Language Agnostic,关于如何将任意字符串散列为RGB颜色值,是否有最佳实践?或者更一般地说:到3个字节 你在问:我什么时候需要这个?这对我来说并不重要,但是想象一下任何GitHub上的管状图。在这里,您可以看到如下内容: 其中每一条彩色线都表示一个不同的git分支。为这些分支着色的低技术方法是CLUT(颜色查找表)。更复杂的版本是: $branchColor = hashStringToColor(concat($username,$branchname)); 因为每次看到分支表示时都需要静态颜色。另外还有一点

关于如何将任意字符串散列为RGB颜色值,是否有最佳实践?或者更一般地说:到3个字节

你在问:我什么时候需要这个?这对我来说并不重要,但是想象一下任何GitHub上的管状图。在这里,您可以看到如下内容:

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

$branchColor = hashStringToColor(concat($username,$branchname));
因为每次看到分支表示时都需要静态颜色。另外还有一点:如何确保哈希函数的颜色分布均匀

因此,我的问题的答案可以归结为
hashStringToColor()

的实现(第1494行及以下内容)。它返回一个
int
。然后,您可以使用16777216(2^24=3字节)计算该
int
的模,以获得一个“RGB兼容”的数字


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

一个好的散列函数将在密钥空间上提供近似均匀的分布。这将问题简化为如何将随机32位数字转换为3字节RGB空间。我认为只取低3字节没有什么错

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

对于任何Javascript用户,我将@jeff foster的公认答案与来自的
djb2
hash函数结合起来

根据问题得出的结果:

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);
}
函数djb2(str){
var-hash=5381;
对于(变量i=0;i16;
var g=(散列&0x00FF00)>>8;
var b=散列&0x0000FF;
返回“#”+(“0”+r.toString(16)).substr(-2)+(“0”+g.toString(16)).substr(-2)+(“0”+b.toString(16)).substr(-2);
}

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

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

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

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

function getRGB(str) {
    return '#' + $.md5(str).substring(0, 6);
}

指向此工作示例的链接已打开。只需在输入字段中输入一个字符串,然后按enter键,然后反复输入以比较您的结果。

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

回购:

演示:

我认为可以忽略散列冲突,因为当发生冲突时,只要不需要更改颜色(如给出的示例中所示),这并不是什么大问题不同。颜色分布的随机性可能是一个美学问题。有很多“丑陋”的颜色,对组件施加某种权重可能是一个可行的想法,以尝试改善“美丽:丑陋”的比例。:)但如果您想确保可读的颜色(例如,确保足够高的对比度和饱和度),您将不得不做更多的工作。在HSV或实验室工作可能更容易,并转换为RGB。您也可以按以下方式格式化颜色:返回“RGB(“+r+”,“+g+”,“+b+”)@斯图格拉:我记不起十六进制格式是否是需求的一部分;现在阅读它似乎不是。由于问题是一般性的,我认为作者对哈希算法比对颜色字符串的格式更感兴趣。但是,如果问题的上下文是CSS,那么你的方法会更简洁。Cheers人,谢谢!@StuGla:这也可以增加透明度。