2012-06-08 20 views
5

有沒有任何方法可以像Java/Android中的任何字符串一樣通過加密/散列函數生成顏色?Android/Java:將任何字符串轉換爲彩色(十六進制)

示例: 字符串「Home」生成一個像「#FF1234」的顏色。
字符串「Sky」生成一個像「#00CC33」的顏色 ...

沒有隨機化。因此,該系統將始終計算相同顏色的字符串

感謝

編輯:字符串是由用戶自由

+0

你也許可以定義一個HashMap的地方,映射字符串的顏色,但你必須填寫它自己。 java的默認顏色類已經定義了一些默認顏色,雖然沒有像「天空」那樣瘋狂。它的東西像「紅色」和「光灰」 –

+1

當然,你可以定義任何你想要將字符組合成24位(無alpha)或32位(如果你想要阿爾法)值的數學函數,然後將其應用爲這個單詞。哈希函數也可以工作,並且很可能會讓您在整個顏色範圍內(在今天的計算機上都可用)更好地分散顏色。像任何不使用隨機輸入的數學函數的散列會導致您始終使用與該輸入字符串相同的顏色。唯一的事情可能是大寫看看。 – trumpetlicks

+0

@Hans - 如果他的輸入是任何仲裁字,HASH地圖將會非常大。最好計算哈希值,並將摘要的輸出位的任何靜態部分(摘要將大於32位或24位)應用於顏色值。我可以看到有可能使用更簡單的CRC或其他東西,但值之間的漢明距離不會像HASH那樣好。 – trumpetlicks

回答

8

String.hashCode()將返回一個int值,所以這只是將它轉換爲十六進制值的問題。

String s = "Home"; 
String color = String.format("#%X", s.hashCode()); 
+0

這又是一個簡單的答案,如果你查找一個字符串的Java hashCode例程,它是一個簡單的乘法加法。這會導致「Home」會得到與「moeH」相同的哈希碼。如果他的要求如此,這可能會很好。 – trumpetlicks

+0

實際上java的String'hashCode()'是一個比那更有效的littent。相同的字符實際上不會生成相同的代碼。檢查一下你自己......在''Home「.hashCode()'和'」emoH「.hashCode()''上做一個'println' ......它們將會不同。 – stuckless

+0

啊是的,這是由於我的總和被併入到SUM(i = 0,i trumpetlicks

1

我猜你是不是想改變資源文件中定義。

取決於你想如何做到誠實。這是數百萬種方法來完成它

對我來說,我會採取每個字符的Ascii值,將它們全部添加,然後將其轉換爲十六進制。有了這個說法,爲了覆蓋太多字符的情況,可以將其修改爲十六進制字符串的最大大小。 IE瀏覽器。 FFFFFF,這樣它包裹並重新開始。

//pseudocode 
counter = 0; 
foreach(char in string){ 
    counter+=(int)char; 

} 
counter = convertToHex(counter)%0xffffff; 
string x = "#"+counter.toString(); 

以後,我把它存在一個字符串

string x = "#"+hexVal.toString(); 

他們,你可以用它做你想要的。

+0

如果他試圖更好地進行單詞到單詞的一對一匹配,這可能會過於簡單化。一個簡單的添加可能更容易導致許多文字保持相同的顏色。另一方面,這是一個非常簡單的數學例程的很好的例子,正如我在上面的說明中所述。 – trumpetlicks

+0

那麼他會想要一個單詞和相關的顏色字典,我會想,雖然它仍然會重複,如果頁面上有足夠的文字 – Fallenreaper

+0

@ Fallenreaper - 這真的取決於他正在嘗試做什麼。如果他試圖儘可能接近1對1的映射,那麼HASH可能是最接近的答案,因爲HASH不僅考慮每個字母的值,而且還考慮排序(這很重要一對一映射)。如果他正在映射任意字,那麼字典可能會變得太大。實時計算將是要走的路。即使HASH在這裏使用時也有問題,因爲只有24到32位(更大)的散列會被使用。用無限的話語,重複必然會發生。 – trumpetlicks

0

你可以嘗試這樣的:

String s = "Home"; 
byte[] b = s.getBytes("US-ASCII"); 
StringBuffer hexString = new StringBuffer(); 
for (int i=0;i<b.length;i++) { 
    hexString.append(Integer.toHexString(0xFF & b[i])); 
    } 
String finalHex = "#" + hexString.substring(0,6); 
System.out.println(finalHex); 

生成一個十六進制:#486f6d

同樣產生六角所有String是你想和不斷增加起來的HashMap作爲鍵值對。

+0

這需要處理順序,但只有在前6個字符相同或不同時才計算。在這種情況下,「homer123456」將獲得與「homer178902」相同的顏色。 – trumpetlicks

+0

糟糕。是的。但是,如果我不做子字符串,十六進制不會是一個有效的顏色十六進制,它只會跨過有效長度。 –

+1

對於循環中的每一次迭代,您所做的只是在當前字符的基礎上添加一個數學函數。這意味着你實際上正在製作另一個與s相同大小的字符串(你已經把它放到了b中)。之後,您只需獲取您生成的字符串的前6個字符的子字符串。您已經創建了一個基於字符的1對1映射,並留下了您之前通過字符6)生成的所有字符。 – trumpetlicks

3

試着在這裏尋找如何創建您的字符串的消息摘要。

http://www.mkyong.com/java/java-sha-hashing-example/

你已經創建了一個消息摘要後,用多少每字節的產生創造你的顏色值。你可以在中間的任何地方使用最不重要,最重要的。

+0

你在我的回答中指出的同樣的問題,你不覺得嗎?對不起,以防萬一,因爲我覺得我可能在這裏弄錯了。 –

+0

感謝您對我的文章發表評論,理解您的觀點。 :-) –

+0

希望我能夠贊成,但今天我完成了我的選票。 –

3

一致的不透明度:

String opacity = "#99"; //opacity between 00-ff 
String hexColor = String.format(
     opacity + "%06X", (0xFFFFFF & anyString.hashCode())); 

或者使用新材料設計的Android調色板:
https://gist.github.com/odedhb/79d9ea471c10c040245e

相關問題