2012-08-11 98 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顏色代碼可以用類似的格式來表示。

也許不完美,但最簡單。