2012-06-08 20 views
5

¿Hay alguna manera de generar un color desde cualquier String en Java/Android como una función Encrypt/Hash?Android/Java: Convierta cualquier cadena en color (hexadecimal)

Ejemplo: La cadena "Inicio" genera un color como "# FF1234".
la cadena "Sky" genera un color como "# 00CC33" ...

Sin randomize. Por lo tanto, el sistema siempre calculará los mismos colores para que las cadenas

Gracias

EDIT: Las cadenas se definen libremente por el usuario

+0

Probablemente se podría definir un mapa hash en alguna parte que se asigna a las cadenas de colores, aunque habría que llenar usted mismo La clase de color predeterminada de Java ya tiene algunos colores predeterminados definidos, aunque nada loco como "Cielo".Son cosas como "Rojo" y "LightGray" –

+1

Claro, puedes definir cualquier función matemática que quieras combinar los caracteres en un valor de 24 bits (sin alfa) o 32 bits (si quieres alfa), luego aplica eso como color para la palabra. Una función hash también podría funcionar, y lo más probable es que obtenga una mejor dispersión del color en todo el rango de color (capaz en las computadoras de hoy en día). Un hash como CUALQUIER función matemática que NO use una entrada aleatoria dará como resultado siempre el mismo color para esa cadena de entrada. Lo único que podría ser mayúsculas para mirar. – trumpetlicks

+0

@Hans - un mapa HASH sería extremadamente grande si su entrada fuera una palabra arbitraria. Es mejor calcular el hash y aplicar cualquier parte estática (la digestión será mayor que 32 o 24 bits) de los bits de salida del resumen a un valor de color. Pude ver potencialmente el uso de un CRC más simple o algo así, pero la distancia entre los valores no sería tan buena como para un HASH. – trumpetlicks

Respuesta

8

String.hashCode() devolverá un valor int, por lo que solo se trata de convertirlo en un valor hexadecimal.

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

Esta es otra vez una respuesta simplista, si busca la rutina hashCode de Java para una cadena, es un simple agregado múltiple. Esto dará como resultado situaciones en las que "Inicio" obtendría el mismo código hash que "moeH". Esto podría estar bien si sus requisitos son como tales. – trumpetlicks

+0

En realidad, String 'hashCode()' de java es un poco más eficiente que eso. Los mismos caracteres no generarán el mismo código. Compruébelo usted mismo ... simplemente haga una 'println' en' "Inicio" .hashCode() 'y' "emoH" .hashCode() '... serán diferentes. – stuckless

+0

Ah sí, esto se debe a que en la suma se incorpora al exponente de la ecuación SUM (i = 0, i trumpetlicks

1

que supongo que no está tratando de cambiar el archivo de recursos.

Depende de cómo quiere hacerlo para ser honesto. Hay millones de formas de lograrlo

Para mí, tomaría el valor de Ascii de cada personaje, los sumaré todos, luego lo convertiré en hexadecimal. Con eso Said, para cubrir el caso de demasiados personajes, lo modificaría al tamaño máximo de una cadena hexagonal. ES DECIR. FFFFFF por lo que se envuelve y comienza de nuevo.

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

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

Después de eso me gustaría almacenar en una cadena

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

ellas se podía hacer con ella lo que quería.

+0

Esto puede ser demasiado simplista si está tratando de obtener una MEJOR correspondencia de palabra a palabra de uno a uno. Una adición simple podría resultar más fácil en muchas palabras sosteniendo el mismo color. Por otro lado, este es un gran ejemplo de una rutina matemática muy simplista, como dije en mi nota anterior. – trumpetlicks

+0

, entonces él querría un diccionario de palabras y colores asociados, pensaría, aunque aún así repetiría si hubiera suficientes palabras en la página – Fallenreaper

+0

@ Fallenreaper - Realmente depende de lo que esté tratando de hacer. Si intenta acercarse lo más posible a un mapeo de 1 a 1, entonces un HASH probablemente sea la respuesta más CERCANA ya que un HASH no solo tomaría en consideración el valor de cada letra, sino también el orden (que importa en un mapeo de 1 a 1). Si está mapeando cualquier palabra arbitraria, entonces un diccionario podría TAMBIÉN DEMASIADO grande. Live calc sería el camino a seguir. Incluso HASH tiene sus problemas cuando se aplica aquí ya que solo se usarían de 24 a 32 bits de hash (mucho más grande). Con una cantidad infinita de palabras, las repeticiones están destinadas a suceder. – trumpetlicks

0

Usted puede intentar algo como:

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); 

genera un hexágono: #486f6d

generan Del mismo modo hexadecimal para toda la String s que desee y seguir añadiendo ellas hasta un HashMap como un par clave-valor .

+0

Esto se encarga de ordenar, pero realmente solo se calculará si la palabra es igual o diferente para los primeros 6 caracteres. En este caso, "homer123456" tendría el mismo color que "homer178902". – trumpetlicks

+0

Vaya. Sí claro. Pero si no hago la subcadena, el hex no resultará ser un hex de Color válido, simplemente cruzará la longitud válida. –

+1

para cada iteración en su ciclo, todo lo que está haciendo es agregar una función matemática basada en el carácter actual. Esto significa que esencialmente estás haciendo otra cadena del mismo tamaño que s (que has puesto en b). Luego, simplemente está tomando la subcadena de los primeros 6 caracteres de la cadena que generó. Ha creado un mapeo 1 a 1 basado en caracteres y dejando atrás todos los caracteres que ha generado el carácter pasado 6). – trumpetlicks

3

Intente buscar aquí cómo crear un resumen de mensaje de su cadena.

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

Después de haber creado un resumen del mensaje, utilice el número de cada uno de los bytes generado para crear el valor de color. Podría usar el menos significativo, el más significativo, en cualquier lugar en el medio.

+0

El mismo problema que usted señaló en mi respuesta, ¿no cree? Lo siento por las dudas, porque creo que podría estar equivocado aquí. –

+0

Entiende tu punto, gracias a tu comentario en mi publicación. :-) –

+0

Desearía poder votar nuevamente, pero hoy he terminado con mis votos. –

3

con la opacidad constante:

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

O usando el nuevo diseño de materiales androide paleta:
https://gist.github.com/odedhb/79d9ea471c10c040245e

Cuestiones relacionadas