|
|
|
---
|
|
|
|
draft: true
|
|
|
|
title: "Deterministically Mapping Strings to RGB Colors"
|
|
|
|
aliases: ["Deterministically Mapping Strings to RGB Colors"]
|
|
|
|
date: "2025-01-25"
|
|
|
|
series: ["strings-to-colors"]
|
|
|
|
series_order: 0
|
|
|
|
author: "Nick Dumas"
|
|
|
|
authorTwitter: ""
|
|
|
|
cover: ""
|
|
|
|
tags: ["golang"]
|
|
|
|
keywords: ["golang"]
|
|
|
|
summary: "Using Go so I don't have to think about color palettes."
|
|
|
|
showFullContent: false
|
|
|
|
---
|
|
|
|
{{< lead >}} {{ </ lead >}}
|
|
|
|
|
|
|
|
## Inspiration
|
|
|
|
The XMPP site has a document describing https://xmpp.org/extensions/xep-0392.html#algorithm-genpalette
|
|
|
|
## The Plan
|
|
|
|
- Take an arbitrary UTF-8 string
|
|
|
|
- Generate an RGB or RGBA color code for it in a deterministic way
|
|
|
|
- SHA1 the string
|
|
|
|
- Interpret equally sized chunks of the hash as integers
|
|
|
|
- Scale those integers into an 8-bit unsigned space
|
|
|
|
## The Implementation
|
|
|
|
### Hashing
|
|
|
|
{{< highlight go >}}
|
|
|
|
{{</ highlight >}}
|
|
|
|
|
|
|
|
### Interpolation
|
|
|
|
- Not sure if interpolation is the right technical term
|
|
|
|
- Using generics
|
|
|
|
{{< highlight go >}}
|
|
|
|
{{</ highlight >}}
|
|
|
|
|
|
|
|
## The Results
|
|
|
|
Below is a sample of "lorem ipsum" with each word colored using this algorithm.
|
|
|
|
|
|
|
|
<p><span style="color:#FDC749;">Lorem</span> <span style="color:#D39A85;">ipsum</span> <span style="color:#452D59;">dolor</span> <span style="color:#3A852F;">sit</span> <span style="color:#0454D4;">amet</span>, <span style="color:#886B09;">consectetur</span> <span style="color:#31A0E5;">adipiscing</span> <span style="color:#99215D;">elit</span>. </p>
|
|
|
|
|
|
|
|
It doesn't look too bad.
|
|
|
|
|
|
|
|
## Possible Improvements
|
|
|
|
- Provide HSV or HSL color values
|
|
|
|
- Light/dark mode awareness
|
|
|
|
- Accessibility. The colors chosen are effectively random with no regard for color schemes, background, display device capability
|