在C#中将字符串散列为Color

Sha*_*awn 17 c# colors

我不知道散列是否是正确的词,但我想将一个字符串半随机转换为十六进制或argb颜色.

我使用了string.GetHasCode函数,但结果偏向于绿色:

string[] list = { "Test String", "something else", "Test Hooray" };

foreach (string k in list)
{
    string x = k.ToUpper().GetHashCode().ToString("X8");
    Console.WriteLine("#" + x.Substring(0,6));
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我喜欢以类似前缀开头的字符串,以使颜色大不相同.例如,"Test String"和"Test Hooray"应该完全不同,因为它们都以"Test"开头.

我并不担心绝对的解决方案,我只想要一些足够好的东西.列表[]一次最多只有10个元素,大部分时间只有2,3或4.这意味着颜色必须与2或3种其他颜色不同.

我基本上生成一个可视列表,颜色引用名称,但名称应始终映射到相同的颜色.

编辑:示例输出:

#66BD44
#7EC83E
#95E4FE
Run Code Online (Sandbox Code Playgroud)

颜色:http://www.colorcombos.com/combotester.html? color0 = 66BD44&color1 = 7EC83E&color2 = 95E4FE&color3 = 000316

Nat*_*lch 27

创建字符串的MD5哈希值,并将前三个字节分别作为红色,绿色和蓝色组件.

以下演示可生成合理的颜色分布.

var words = ("She sells sea shells on the sea shore but the sea " +
             "shells she sells are sea shells no more.").Split(' ');
var md5 = MD5.Create();
var box = new ListBox
    {
        Dock = DockStyle.Fill,
        DrawMode = DrawMode.OwnerDrawFixed
    };
box.Items.AddRange(words);
box.DrawItem += (sender, e) =>
    {
        var value = (string) box.Items[e.Index];
        var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
        var color = Color.FromArgb(hash[0], hash[1], hash[2]);
        using (var backBrush = new SolidBrush(color))
        using (var foreBrush = new SolidBrush(e.ForeColor))
        {
            e.Graphics.FillRectangle(backBrush, e.Bounds);
            e.Graphics.DrawString(value, e.Font, foreBrush, e.Bounds);
        }
        e.DrawFocusRectangle();
    };
new Form {Controls = {box}}.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

截图