Hay una mejor práctica sobre cómo hash de una cadena arbitraria en un valor de color RGB? O, para ser más general: a 3 bytes.

Estás preguntando: Cuando yo necesito esto? No me importa, pero imagino que los de tubo de gráficos en cualquier GitHub página de la red de. Allí se puede ver algo como esto:

Hash de la cadena en color RGB

Donde cada línea de color significa una clara git branch. La baja tecnología a color de estas ramas sería una CLUT (tabla de colores de consulta). La versión más sofisticada sería:

$branchColor = hashStringToColor(concat($username,$branchname));

Porque quieres estático de un color cada vez que vea las ramas de la representación. Y para puntos de bonificación: ¿Cómo se puede asegurar un color uniforme distribución de la función de hash?

Así que la respuesta a mi pregunta se reduce a la aplicación de hashStringToColor().

InformationsquelleAutor Jens Kohl | 2012-06-20

5 Comentarios

  1. 30

    Una buena función hash proporcionará una cerca de distribución uniforme sobre el espacio de claves. Esto reduce la pregunta ¿cómo puedo convertir de un azar del número de 32 bits a un 3 bytes de espacio RGB. Yo no veo nada malo con sólo tomar la baja de 3 bytes.

    int hash = string.getHashCode();
    int r = (hash & 0xFF0000) >> 16;
    int g = (hash & 0x00FF00) >> 8;
    int b = hash & 0x0000FF;
    
    • Gran trabajo, gracias.
    • Aunque si quieres asegurar legible colores (por ejemplo, garantizar suficientemente alto contraste y saturación), vas a tener que trabajar un poco más que eso. Podría ser más fácil trabajar en VHS o en el LABORATORIO, y convertir a RGB.
    • Precioso solución!
  2. 24

    Para cualquier Javascript usuarios, he combinado el aceptado la respuesta de @jeff foster con el djb2 función hash de erlycoder.

    El resultado por la pregunta:

    function djb2(str){
      var hash = 5381;
      for (var i = 0; i < str.length; i++) {
        hash = ((hash << 5) + hash) + str.charCodeAt(i); /* hash * 33 + c */
      }
      return hash;
    }
    
    function hashStringToColor(str) {
      var hash = djb2(str);
      var r = (hash & 0xFF0000) >> 16;
      var g = (hash & 0x00FF00) >> 8;
      var b = hash & 0x0000FF;
      return "#" + ("0" + r.toString(16)).substr(-2) + ("0" + g.toString(16)).substr(-2) + ("0" + b.toString(16)).substr(-2);
    }
    

    ACTUALIZACIÓN: Fija la cadena que devuelve a devolver siempre un #000000 de formato de cadena hexadecimal basado en una edición por @alexc (¡gracias!).

    • También puede formatear el color de esta manera: el regreso «rgb(» + i + «,» + g + «,» + b + «)»
    • No recuerdo si el formato hexadecimal, fue parte de los requisitos; la lectura que ahora no aparecen. Ya que la pregunta fue formulada de forma genérica, yo creo que el autor estaba más interesado en el algoritmo de hash que el formato de la cadena de color. Sin embargo, si el contexto de la pregunta es CSS, la suya sería una forma mucho más limpia de hacerlo. Saludos man, gracias!
    • Esto permite también la adición de la transparencia.
  3. 9

    He intentado todas las soluciones de otros, pero encontró que las cadenas de caracteres similares (cadena1 vs cadena2) producir los colores que son demasiado similares para mi gusto. Por lo tanto, he construido mi propio influenciado por los aportes e ideas de los demás.

    Esto va a calcular la suma de comprobación MD5 de la cadena, y tomar los primeros 6 dígitos hexadecimales para definir el RGB de 24 bits de código.

    El MD5 que la funcionalidad es una fuente abierta de JQuery plug in.
    La función JS va como sigue:

    function getRGB(str){
        var hash = $.md5(str);
        var rgb = '#' + hash.substring(0,2) + hash.substring(2,4) + hash.substring(4,6);
        return rgb;
    }
    

    Un enlace a este ejemplo de trabajo es en jsFiddle. Justo en la entrada una cadena de caracteres en el campo de entrada y presione la tecla enter, y hacerlo una y otra vez para comparar sus resultados.

    • Usted puede simplificar la línea 3 a: var rgb = '#' + hash.substring(0,6);
    • he intentado todas las soluciones de otros, siempre (…) no, no lo hiciste 🙂 como Jeff Foster respuesta se describe de la familia con infinita muchas soluciones. Su solución es un miembro de esta familia, por cierto.
  4. 2

    Como un ejemplo, esta es la forma en Java calcula el hash de una cadena (línea de 1494 y siguientes). Devuelve un int. Usted puede calcular el modulo de que int con 16.777.216 (2^24 = 3 bytes) para llegar a un «RGB compatible con el» número.

    Es un determinista de cálculo de modo que la misma palabra(s) siempre tienen el mismo color. La probabilidad de colisión de hash (2 cadenas de tener el mismo color) es pequeño. No estoy seguro de la distribución del color, pero probablemente bastante aleatorio.

    • Creo colisiones de hash podría ser descuidado, ya que cuando se produce una colisión que no es mucho de un problema siempre y cuando no se necesitan los vecinos de colores (como en el ejemplo dado) a ser diferentes.
    • La aleatoriedad de la distribución del color podría ser una cuestión estética. Hay un montón de ‘feo’ de colores, podría ser una idea práctica para aplicar algún tipo de peso a los componentes para tratar de mejorar la bonita:feo relación. 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here