2012-08-11 115 views
1

我在我的数据库中有各种对象,由唯一的System.Guid's标识。当我展示他们时,我希望他们每个人根据他们的指导拥有独特的颜色。从Guid生成颜色

所以我想是这样的:

public Color ColorFromGuid(Guid guid) { /* ?? */ } 

ColorFromGuid(databaseObject1.Guid) == ColorFromGuid(databaseObject1.Guid) 
ColorFromGuid(databaseObject2.Guid) == ColorFromGuid(databaseObject2.Guid) 
ColorFromGuid(databaseObject1.Guid) != ColorFromGuid(databaseObject2.Guid) 

什么是做到这一点的最好方法是什么?

编辑显然有WAY更独特的GUID比颜色,所以也没有办法,每一个GUID都会有它自己独特的色彩。我只是在寻找一个好的品种。

+1

我觉得Guid是36 charachter。红色的第一个12个字符,绿色的第二个12个字符和蓝色的第三个12个字符。将这12个字符转换为int。并通过该值产生随机数0-255。 – 2012-08-11 02:55:21

+0

@LarsTech该阵列中可能会有数万亿和数万亿的条目。这似乎有点低效...... – Entity 2012-08-11 02:55:25

回答

3

你可以这样做:

return Color.FromArgb(guid.GetHashCode()); 

如果你需要一个不透明的颜色,使用the overload of Color.FromArgb,让你指定的阿尔法。如果你想要类似的GUID产生不同的颜色,你可以在Guid上做一个不同的散列。 an MD5 hash,并从中获取数字以生成您的颜色。

3

怎么是这样的:

public Color ColorFromGuid(Guid guid) 
{ 
    var values = guid.ToByteArray().Select(b => (int)b); 
    int red = values.Take(5).Sum() % 255; 
    int green = values.Skip(5).Take(5).Sum() % 255; 
    int blue = values.Skip(10).Take(5).Sum() % 255; 

    Color color = Color.FromArgb(red, green, blue); 
    return color; 
} 

这可能不是很理想,但你得到一种颜色,每GUID,和相同的GUID应导致每次都相同的颜色。

+0

而不是'.Select(b =>(int)b)',你不能使用'.Cast ()'? – Adam 2012-08-11 03:24:14

+0

@codesparkle:在LINQPad中获得一个'InvalidCastException'。我没有打算运行Visual Studio。 – 2012-08-11 03:27:18

+0

的确,在VS中的结果相同,因为'Cast '[输入序列中的项目框](http://stackoverflow.com/a/445497/1106367)。 – Adam 2012-08-11 03:46:12

1

如果你用一个函数来做这件事,你会感到失望。

Guid比颜色多很多倍,因此很多Guids会映射到相同的颜色。 Guid的许多次会映射到太接近的区分的颜色(例如#FFFF9999和#FFFF9998)。实际上,你只能说出少数几种颜色之间的差异 - 比如说绝对最大值为50。

指尖不是随机的。只需重复一遍:Guid是而不是随机。特别是如果你使用的是数据库生成的Guid,它可能是所谓的'sequential uniqueidentifiers',Guid的前半部分是相同的。这是否意味着你最终会为每个Guid产生不同的粉红色阴影?也许。

所以,除非你知道你的GUID的分配,并能够创建该分配映射到一个合适的颜色分布的函数,你也不会快乐与由函数生成的颜色。

在extentible办法做到这一点最简单的方法是在包含两列数据库创建一个简单的表格 - 颜色(名称,十六进制代码或RGB值)和一个GUID。做这件事最花费时间的部分是选择颜色。这使您可以更改特定项目的颜色,如果它与另一种颜色太相似。没有技巧,只是简单的映射。

0

如果您需要颜色HTML,你可以使用这个或类似:

cssColorcode = "#" + myguid.Substring(0, 6); 
// result can be something like: #ab3fa4 

GUID是怎样的一个六的,和HTML CSS颜色代码可以用类似的格式来表示。

也许不完美,但最简单。