121 comments

[ 3.6 ms ] story [ 212 ms ] thread
warning, this site includes an extremely loud mp3 [0] that plays automatically without warning and is very startling

[0] https://text.bargains/media/coin.mp3

It didn't play for me, but this is fantastic and brings me back to the 90's / early 00's era of web design with midis and sound effects. I miss that web.

Music and sound effects add to the mood and aesthetic of presentation. It's not so strange, either. TikTok leans on it heavily and people are loving it.

I want a return to sound on the web.

my complaint isn't with sound on the web. my complaint is with there being a 'screamer' on the site.
Web browser bug that it's even possible.
This seems like a job for hashcat.

  i should probs be working Lmfao          
you can cheat by adding trailing spaces
> In particular, an amulet’s whitespace, punctuation, and diacritics should all be “load bearing”.
It would be nice if it only considered alphanumerics. Downside: punctuation can mean a lot in poetry. Upside: people might make punctuation less meaningful just to have more strings to try.
The 6 byte string "dammit" works. Though I suppose it's not a poem.
How did you find it?
I’m not OP but “I tried all kinds of things and it didn’t work so in frustration I typed...”
My attempt at one: https://pastebin.com/SEEpx3C4

> Hello Hackernews, This is one. Whats so tough?

47d751f8964d717320b888888b81db0a8a35e79f528549f0e9dba13e0e4d6c4c

(In short, allowing all unicode characters makes this trivially easy... HN gets rid of some of the unicode weirdness though so I had to put it on Pastebin. I assume this matches the 'load bearing' criteria as I only use variable width spaces rather than additional characters.)

Not putting it on the blockchain though because I don't hate the planet.

> I assume this matches the 'load bearing' criteria as I only use variable width spaces

I think you might be stretching the rules slightly with that stuff.

Using "medium mathematical space" (U205F) instead of an ascii space seems pretty clearly to be using a special character for the purpose of manipulating the hash.

I'd much rather amulets be created not by messing with invisible codepoint differences, but rather by making more typographically distinct entries and picking out ones that are correct.

When I saw "generated", I thought "have a thesaurus suggest word swaps", not "manipulate invisible unicode characters"

> When I saw "generated", I thought "have a thesaurus suggest word swaps", not "manipulate invisible unicode characters"

Hehe maybe. To generate it I manipulated the width of the spaces between the words, changed the grammar and did word swaps :)

Looking at the examples provided, they also seem to use line breaks to add further entropy.

Adding data to a blockchain doesn't use extra energy... As in, probably in the order of posting it to HN. The next block will be mined whether or not your amulet is in it.

More likely however is that the code you used to generate this amulet was worse for the environment.

Competing for the oversubscribed resource of space in the next block does drive up the price, though, which in the end also drives up the mining reward and ultimately energy use.
Holy smokes, these things generate a ton of CO2 if it takes a metric ton to store indefinitely on the blockchain.

That's apparently 1/5-1/8 the CO2 of RUNNING AN ENTIRE HOUSEHOLD FOR A YEAR.

https://www.whatitcosts.com/carbon-offsets-cost-prices/

The only way I see this as not being terrible is if the offset is much less bad on a yearly basis.

This also seems to be hundreds of times more CO2 than the average US internet user uses in a year.

https://www.energuide.be/en/questions-answers/do-i-emit-co2-...

I don't think it takes a ton, they were probably overcompensating.
1T is a huge overcompensation. If you take Ethereum's estimated daily carbon output and divide it by its daily gas units (the unit by which computation is measured) and assign responsiblity that way, minting an Amulet consumes about 20KG CO2 emissions. Transferring one, about half that.
> A mullet d023069c25bf838888b73a8f135a8bd125be3f7081edbe8a32466e93a333dd38
Hello HackerNews from fxtentacle !!1!!!!1!111!!11!!!11!!1

2c27e38aaba003380ea55c4c674aa2f3f17743481c107dc388888884a689353b

This is an epic amulet!

`All Play And No Work Makes Jack A Rich Boy` is a common amulet

    d978352a5d57437fa1c8388f428888a5d3c6bd1d0a4c1726e21113414805694a
                              ¯¯¯¯
'I wonder if there's any chance of finding one just by typi' is my uncommon ('...dc28888858...')
This concept is philosophically interesting, because an infinitely-powerful deity could compose text with a hash value of all 8's, and anyone could verify that it was authored by someone with more computing power than the universe.

The fact that this is possible, but hasn't happened, may imply that we have never received a message from such an entity.

I doubt that is possible with the 64 byte limit (at least making something that makes sense to read as a poem, as per the challenge).
There's something like 2^59 64 byte strings that hash to all 8s. (Er, 2^168? Math is hard.)
But how many of those strings consist entirely of sensical prose?

Even in a string of just 4 letters, out of c500,000 combinations only c5k are a valid word. The longer the string, the smaller % of random letter combinations will happen to be valid prose.

English text has about 1 bit of information per character. So there are about 2^64 different meaningful 64 character messages.
(comment deleted)
You have 2^256 possible hash values and 2^(8*64) = 2^512 different 64 character strings. So for each hash value (including the "only 8s" one) there are, on average, 2^256 64 char strings mapping to that value.

Therefore (but also trivially) a random 64 character string (or any string) has a 1/2^256 chance of having all 8s in its hash. Since English has about 1 bit of information per character, there are only about 2^64 different non-gibberish 64 char strings. The odds that there exists any English phrase with an all 8 hash are 1/2^192 (i.e. zero).

Standard English text is around 1 bit of entropy per character, but it doesn't mean you can only write 2^64 non-gibberish text in 64 characters. For example, there are around 40k eight letter words, way more than 256. The entropy is so low because we keep using the same words, but we don't have to. We can also use abbreviations, invent proper nouns, and we don't even have to limit ourselves to English or even a single language.

"犬 in French is chien, that one is Klign jr" is perfectly valid.

I don't know if all 8s is possible, UTF-8 is quite wasteful for that purpose. Maybe we could take advantage of kanji. I don't know enough about Japanese, and even less Chinese, but it looks like you could make a proper noun by mashing any kanji together, including the obscure ones, and it will be usable and pronounceable. Maybe not pretty, but valid.

Edit: And as a last resort, we could cheat with "password: }8pHgaQ^?7ic'6KIO!uDXQnhL3(6hcfZmRYnGUw1Pz`c?y@D"

> For example, there are around 40k eight letter words, way more than 256. The entropy is so low because we keep using the same words, but we don't have to.

Correct, but that low entropy is what distinguishes

    Monday Tuesday Wednesday Thursday Friday Saturday Sunday
from (sampled from random Wikipedia article titles)

    Alabama Christopher List Park Girlfriend Manor crucifera
or

    I saw your dad outside of Walmart yesterday.
from (5th word of 2nd section of random Wikipedia articles)

    gospel Rich existed school and for Deputy he

> We can also use abbreviations, invent proper nouns,

Sure, make it 1.1 bits per character (the 1 bit is not a precise number anyway). That doesn't change anything about the orders of magnitude involved.

> we don't even have to limit ourselves to English or even a single language.

I tried to look for entropy of Chinese writing, and I've only found an upper bound of 3.8 bits per (UTF8) byte. That makes it still unlikely but at least conceivable that there is an all-8 amulet made of 64 bytes of Chinese text.

> UTF-8 is quite wasteful for that purpose.

Right, but as far as I understand that's the constraint.

> And as a last resort, we could cheat with "password: }8pHgaQ^?7ic'6KIO!uDXQnhL3(6hcfZmRYnGUw1Pz`c?y@D"

Yes, but that's not interesting from either an art nor from a computer science point of view.

Yeah, my idea makes more sense if you omit the 64-byte limit; then the input can be an entire book.

For an ideal hash function, every output maps to an infinite number of inputs. I don't know if SHA-256 has that property, but God could just define the simplest ideal hash function and let people cryptanalyze it.

The more likely explanation would be that a human has broken SHA-256.
...and with a preimage attack, something that even MD4 --- for which collisions can easily be generated with hand calculation --- resists to this day. I'm reasonably confident that if the three-letter-agencies know of such attacks, or general techniques for doing so, they would be very quiet about it.
Yes. Or even that someone reinvented computing. Or contact from an alien race. Are all more plausible than a deity. For a proof of God I would require something without in which it really is the most likely explanation, like a face appearing on a piece of toast
There was a religious apologetics claim, widely presented and debated in the 1990s, that there were statistical anomalies in the Torah to show that it was really written by God: https://en.wikipedia.org/wiki/Bible_code

However, the measurement technique was somewhat underdetermined, which is a problem akin to p-hacking (as you could look for many possible anomalies and only publish the ones that you successfully find).

> anyone could verify that it was authored by someone with more computing power than the universe

I never thought of this that way, but that's an excellent way to put it! (Although you also need to assume that the hash is extremely strongly preimage-resistant, which we don't have good mathematical techniques to prove today.)

One challenge for this: what is the canonical text encoding and canonicalization, and what is the canonical hash function?

Well, if I were God, I would just define a canonical encoding and hash function as part of the message. Mathematicians would study the algorithm over the years, but never find any flaws.
Isn't that cheating though? By controlling the hash function you can alter the function itself until your message will meet the requirements, even though someone later on would find it impossible to compute a new message that meets the same?
Presumably, God could foresee the cryptographic flaws of any algorithm, and could therefore design a simpler secure hash function than any human. In this case, "secure" means that there exists no algorithm to compute a preimage faster than brute force.

This would be a "nothing up my sleeve" function, in contrast to something like https://en.wikipedia.org/wiki/Dual_EC_DRBG that cryptographers would identify as sketchy.

Hypothetical question: What is the Kolmogorov complexity of a secure 256-bit hash function?

Hence God must have computational power greater than a Turing machine, at least if he wants to prove His hash function minimises Kolmogorov complexity.

For a rough upper bound, there are some examples at [0], which could be less than 100 characters of C (once golfed).

[0] https://stackoverflow.com/a/14409947/5327391

Is every sequence of 256 bits a valid sha256 hash? I’m not having luck searching online for that answer.
Optimization (for any attribute) is left as an exercise for the reader.

  #!/bin/bash
  while true ; do
    W1=`shuf -n 1 /usr/share/dict/words`
    W2=`shuf -n 1 /usr/share/dict/words`
    W3=`shuf -n 1 /usr/share/dict/words`
    W4=`shuf -n 1 /usr/share/dict/words`
    W5=`shuf -n 1 /usr/share/dict/words`
    SHA=`echo "$W1 $W2 $W3 $W4 $W5" | sha256sum | egrep 8888`
    if [ "$SHA" != "" ] ; then
      echo "$SHA $W1 $W2 $W3 $W4 $W5"
    fi
  done
Sample output:

  00b6b668465deadabf11d7296e7de33780643e23c967e255888884f34ecc41de  - frigorifical psittaceous goodeniaceous oostegite handsomeish
  b3096654fa38ca318888b2c4eea4a9d93b9e49b02c54f390d2f06ca74d9e8edb  - refuser skepful assumptive hypostatic toothleted
  ef3a7d3b25a8cffe730b888800884ddde96ea7e58608c8bd714b5db7a5caf3fb  - coenobioid graticulation astrognosy remica swarthily
  c8888957c0105b6ea64b24853ec6c1a34828c0552c2776b6a4bd35d6129c3b87  - barbarously withinside underwing autocratic punkah
  5ca89be465ab472eea785ab950ea28ce03457a09d1fecd2bc75b88888c269e5d  - Malay persuade truantlike binodose suppose
  20bdbfcdb6345888814555c2d0abeaa2f2b7c81506a661c99f7c2675688d4917  - dorsimedian seasonably cuckoo eyewinker hyperthyroidization
  337675d56afb73835c58888f509de783a9385e3f249784d50b9a3e50c6a68a77  - squamous calp choosingly velum forborne
  e08888a15d449e8c2dab2283d53adfa5b1bfc7fe99ccd0fd7bbe45a4ce9b0bdb  - equipartition creatininemia treaclewort Menobranchus undisturbedness
>left as an exercise for the reader

so do we start with markov chain generators or jump straight to gpt-3?

You only have to run shuf once:

shuf -rn 5 /usr/share/dict/words | tr '\n' ' '

How did they compute the SHA-256 of the example given? If I try it I don't get the 8888s
Maybe you have a newline at the end by accident.

Checking the mythic:

echo -n "29560568 is the answer to life, the universe and everything." | shasum -a 256

Thanks. I did have a trailing newline. Adding that -n fixed it.
(comment deleted)
One more amulet generator, for the road...

  #!/bin/bash
  COUNT=1
  while true ; do
    COUNT=$((COUNT+1))
    SHA=`echo "I adopted $COUNT puppies." | sha256sum | egrep 8888`
    if [ "$SHA" != "" ] ; then
      echo "$SHA I adopted $COUNT puppies."
    fi
  done
Sample output:

  4f3e14ded07eda16a7fb57c42aebf1f97ef67acba4980bf472a8e188887c7726  - I adopted 6484 puppies.
  57c3e9fd05f06a705206d38888b317b5eb596d35c6f308b909a440e2c8e391c8  - I adopted 6627 puppies.
  4624f6bb4c7d3d8328888495c1422a1891b609b81abda3ff4d70bedd1c4f6cdd  - I adopted 12631 puppies.
  9c0be05548139888804d3799ad5729ea424b0487487a6b18803f1aa5746c1904  - I adopted 15663 puppies.
  c60fc3f97f62ee07665325e235faa05fefc445aee7d356a9d81f58888c475147  - I adopted 15861 puppies.
Bonus points if the number of puppies adopted is a palindromic prime. [1]

[1] https://en.wikipedia.org/wiki/Palindromic_prime

Tweaked to find 5 8's:

88888eb74ed90df21487f33795e8af9f578b6b5e359db71e4ac0b2bd8b1115c8 - I adopted 34534 puppies. 7c31d274888888f28e37743d4c554e5fffdb7df35a1291bc83119e31743a233b - I adopted 43653 puppies. e88888508aeaea73f45925e9af3e95890ec15362ce0b0244f56d271f0ba8ce8e - I adopted 53527 puppies.

probably more coming soon ...

(comment deleted)
Now 6:

7c31d274888888f28e37743d4c554e5fffdb7df35a1291bc83119e31743a233b - I adopted 43653 puppies. 5888888c44ce19109d9021679ca8023314cb06a0b48fe9f57f34d2f83ee5a971 - I adopted 321255 puppies. b4b4f1bdf07da6049c7aa172504e8f7464d13333508888889743ebd9136f0345 - I adopted 521564 puppies.

It's hard to buy the classification of rarity outlined in TFA.

Having to write 40k submissions to find one with 6 8s more than qualifies as rare to my mind.

Automatically incrementing a string might satisfy the requirements, but for an artistic project it's not what I'd base the metrics on, and indeed I don't think the author did.

(comment deleted)

     7, b2a3a24530d0e7c15e821d944e34a28178888888458c7d660573ad6e11707df1 - I adopted 2222020 puppies.
     8, 8888888808a07e25f69a55118d348c25774e94d21800c6015341d0ff42664e62 - I adopted 6443609616 puppies.
     9, 7f0183bc4b5eae3888888888cd55e9b158b6e6f258c7c82f4005cc2ea5ae5a5a - I adopted 4135438531 puppies.
    10, 20d394319b224629b96f8888888888b800e2c53b04f3ed6d0dea7e8f96e41c41 - I adopted 1356889176260281396 puppies.
11, 949f43b1118080d2b3b5888888888889ca2e3bee84b2298bbe4f18d6d203ed47 - I adopted 18425680900202321846 puppies.
How about modifying this one, to use hexadecimal numbers instead?
Modified your script to use hexadecimal numbers. Also changed `sha256sum` to use `shasum`, which is what's available on vanilla (not "brewed") macOS.

    #!/bin/bash
    COUNT=0
    while true; do
            hex=`printf "%04X\n"  $COUNT`
            SHA=`echo -n "$hex puppies adopted me." | shasum -a 256 | egrep 8888`
                    if [ "$SHA" != "" ] ; then
                            echo "$SHA $hex puppies adopted me."
                    fi
            COUNT=`expr $COUNT + 1`
    done
Here is a mythic one:

> 29560568 is the answer to life, the universe and everything.

And here is a beyond mythic one:

> 6029497765 is the answer to life, the universe and everything.

895032f28cc98e6c10ff4218fa9890eac36a812837668888888888a30ae477da

This concept is a good way to prime someone for understanding how crypto mining works. Cool idea!
This script [0] takes any amulet and adds various combinations of unicode white space to the end to create a rarer version without visually changing the original. It definitely goes against the spirit of white space being "load bearing", but was fun to make anyway.

[0] https://github.com/blopker/amulet_finder

So 10 8's is mythic. That's only 2^40 (probably less since the 8's dont have to be in a specific position in the hash). Based on https://gist.github.com/epixoip/a83d38f412b4737e99bbef804a27... you should be able to bruteforce a mythic amulet in 48 seconds with a high end gpu from 2016.

Doesn't sound that mythic to me.

What's poetic about brute forcing it?
Nobody here has been making them by hand.
Sure, but the worthwhile ones are actual prose.

If you can brute force 9 8's from only English words (or whichever language), I'd still call that impressive.

Can you please share how you got the 2^40 number? I've been trying to think of how to figure out the odds of these.

Odds of 4 hex 8's in a row given a 4 digit string is (1/16)^4.

Odds of 4 hex 8's in a row given a 5 digit string is number of ways to arrange 8s in the first 4 digits (1) times 16 possible 5th digits plus number of ways to arrange 8s in the last 4 digits (1) times 16 possible 1st digits, all divided by the number of possible arrangements (16^5)

So 8888X or X8888 is (2 * 16) / (16^5)?

And then 8888XX or X8888X or XX8888 is...

(16^2 + 16^2 + 16^2) / (16^6) ???

I did 10 8's (mythic!) at the beggining of the hash (2^4)^10 = 2^40.

I didnt account they could start at any position, so the actual number is probably

(64-10)/2^40 ≈ 1 / 2^35

We should also subtract strings longer than 10 that were double counted. However i think the probability of such things is negligible relative to 2^35.

If instead we were doing 4 8's i think it would be: (64-4)/((2^4)^4) = 60/2^16 ≈ 2^10

I've always been bad at calc probabilities so i may have messed this up.

> Odds of 4 hex 8's in a row given a 5 digit string is number of ways to arrange 8s in the first 4 digits (1) times 16 possible 5th digits plus number of ways to arrange 8s in the last 4 digits (1) times 16 possible 1st digits, all divided by the number of possible arrangements (16^5)

You're double counting "88888". But then again so am i.

I wrote a CUDA kernel to look for some. My 3080 managed 3 billion/second including population counting the 8s. After 48 seconds it had spat out three 10-eights and one 11-eights amulet:

  Here are some excellent hex digits: 251d5b059cefc6f3
which hashes to

  b282a850c34ebfbfe4d41797aebc567988888888888312220e834356a26b65fd
Of course, it gets a lot harder if the goal is poetry, and not just jamming hex chars into a string.
Now I want to make a quine amulet
After feeding it different fortune databases:

    Conscience is what hurts when everything else feels so good.
I found an "uncommon" one.
If you accept the questionable premise that the people that write short summaries used in IMDB are writing poetry, then the summary of "Road Trip" (tt7328966):

Two friends set out on a road trip but one of them has a few questions he needs answered.

Is an "epic" Amulet (7 8s in a row)

I think I need to stop now.

Only 4 8's doesn't seem rare enough to be interesting.
You begin to contemplate neutral yet fascinating sensations.

8c29152333c388888888961e813457759ca87a8b54078779f8cbdefedf6401d2

You picture an infinite and essentially captivated dimension.

a8888ff4ddb3e7c0c38d30a8b4184f78d85888806f67ab73ca64c5ad51cae6b8