.net - 从字符串生成唯一的颜色

标签 .net algorithm colors

我必须在一些不透明矩形区域中绘制一些任意字符串。 我需要该区域的背景颜色对于给定的字符串是唯一的。

比如说,如果我画“Paris”和“Paris1”,它们的颜色应该不同。但如果我把“巴黎”画成蓝色,那么其他“巴黎”也应该画成蓝色。

我再次强调,颜色应该是不透明的。

为此我找到了一个简单的解决方案:

rectangleBackColor = Color.FromArgb(myString.GetHashCode())

问题是不透明度。我需要“消除”“A”(alpha)成分。

现在,这样的代码可能会起作用

  rectangleBackColor = Color.FromArgb(myString.GetHashCode())
  ' set the alpha value = 255 for an opaque color '
  rectangleBackColor = Color.FromArgb(255, rectangleBackColor) 

但它可能会失去字符串颜色的唯一性。

假设,我有两个不同的 hashCode(十六进制)x AB 11 22 33x FF 11 22 33
AB 设置为 FF 我使两个不同的字符串具有相同的背景颜色 (x FF 11 22 33)。这不好。

最佳答案

您无法为字符串生成唯一的颜色:

RGB 空间有 24 位或 2^24-1 个唯一值(总共 16777215 种颜色)。

以下代码将打印 16777220 个唯一字符串(比颜色数量多 5 个):

for(int i=0; i<16777220 ; ++i) Console.WriteLine(i.ToString());

因此,如果您采用上面程序生成的所有字符串并给出颜色,则您必须至少有 5 个具有重复颜色的字符串。

顺便说一句,GetHashCode 不返回唯一值,只是均匀分布,用 32 位重复上面的证明(您需要在 for 循环中将 i 设为 uint 并将数字更改为大于 4294967295,但这些是仅更改),并且您发现无法为 32 位值(或任何其他固定大小值)中的每个字符串获取唯一值。

你的方法非常好,重复颜色可能很少见。

关于.net - 从字符串生成唯一的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594672/

相关文章:

c# - 在 C# 中定义权限集的枚举

java图像颜色公式

java - 通过单击鼠标更改 JPanel 的颜色

c# - 将 C# 字符串传递给 VBscript

c# - 使用 WebDav 通过代理上传到 SharePoint 失败并显示 HTTP 405

C# Web 服务 - 适用于 IE 但不适用于 Safari

java - Codility Brackets 挑战性能问题

algorithm - 三个数组和子集和

python - 生成密码列表时出现内存错误

javascript - 如何使用 E-308 作为算法将 SRM 转换为 L*a*b*?