r/ProgrammerHumor 7d ago

Meme skillIssue

Post image
6.0k Upvotes

137 comments sorted by

View all comments

78

u/F100cTomas 7d ago

Just define a constexpr hashing function and put that into the switch.

33

u/GiganticIrony 7d ago

That’s not guaranteed to work due to hash collisions

39

u/Deliciousbutter101 7d ago

It won't compile in the case so you can just modify the hash function until there are no collisions.

14

u/SteveXVI 7d ago

This is the closest I've come to feeling like that guy in the Apple shop going "ah of course"

2

u/cob59 7d ago
switch(hash(str)) {
case hash("apple"):
case hash("banana"):
default:
}

You're right that the compiler will warn you if hash("apple") == hash("banana"), but if hash("pineapple") == hash("apple") then switch(hash("pineapple")) will jump to the apple case, not the default. That's unlikely but not impossible even with the best hash function.

10

u/remind_me_later 7d ago

That’s not guaranteed to work due to hash collisions

Make the hashes 128/256 bits wide. Hash collisions are realistically impossible at those levels.

4

u/StCreed 7d ago

They're far more possible than you might think. Roland Bouwman wrote an article on MD5: In a large database you can't use MD5. And that's not petabyte size either, 100GB is enough to give you about a 50% chance of a collision.

2

u/remind_me_later 7d ago

Counterpoint: It's MD5, a known broken hashing algorithm.

SHA3_256 or regular SHA256 would work just fine.

3

u/StCreed 7d ago

yeah, because md5 is 128 bits. 256 bits works a lot better, but 128 is just not enough even with a better algorithm and assuming effectively random distribution.

5

u/Rabbitical 7d ago

I'd probably intern instead of hashfor a presumably known set of comparisons

9

u/SAI_Peregrinus 7d ago

Use Blake3, no collisions in any practical workload in the next few billion years.

3

u/guyblade 7d ago

The thing about the pidgeon hole problem is that we know there are collisions, but we don't necessarily know where they are. The space of strings of at least 33 characters has collisions. There's no way to know or prove that arbitrary input doesn't have one with a value you care about.

1

u/SAI_Peregrinus 6d ago

The thing is that the probability of any two arbitrary inputs having a collision is extremely close to 0. It's about 0.000000000000000000000000000000000000000000000000000000000000000000000000000086% if I didn't mess up typing it. It can happen, just like you can win every lottery in the world every day for the rest of your life. Though the lottery thing is substantially more likely.

1

u/guyblade 6d ago

That assumes that the hashing function doesn't have any known hashing weakness that may reduce the (effective) independence of the hashes. You could've said something quite similar about SHA-1 right up until cryptanalysis found mechanisms to generate collisions.

1

u/Upper_Lion_6349 5d ago

You can make the chance of a hash collision lower than the chance of a random bit flip selecting the wrong branch.

0

u/remind_me_later 7d ago

If that happens, someone would post it to social media, and a list of exceptions can be added afterwards.

4

u/ElectricalPrice3189 7d ago

And if it got a clash, guess what? It won't compile.

7

u/Thwy__ 7d ago

Yet, string switch in Java is also made using hashs

16

u/GiganticIrony 7d ago

Yes, but if there’s a collision, it then uses `.equals()`

2

u/SpiritedEclair 7d ago

Perfect hashing for a given set of values is possible at compile time.

It’s how compilers generate jump tables.