logoalt Hacker News

teo_zero12/08/20242 repliesview on HN

Row 100 of hm_put() clears all contents of the item struct, thus losing the pointer to where the previous value was stored. But then row 107 needs this pointer to pass it to realloc().

Additionally, in case of overwrite, the memory previously allocated for the key is leaked.

All in all, I don't think row 100 is really needed, and removing it wouldn't do any harm.

Finally, deletes are hard in hash maps. Either you decide that deletes are not allowed, or you implement them with tombstones or re-insertions. A half-backed solution is not an option.

Hope these suggestions help you.


Replies

acmj12/09/2024

I agree. How to deal with deletions is a 101 of hash table implementation. Many CS majors could get it right or at least know about the caveat. It is amusing that many high-quality posts on hash tables are buried in the "new" section of HN while this half-baked toy floats to the front page, with 83 github stars at the moment. People don't know what they are upvoting for.

eqvinox12/09/2024

> Finally, deletes are hard in hash maps.

Deletes are hard in open hash maps like here; they're trivial in chained hash maps.

(I'm only posting this because this seems to be an exercise/learning-ish HN post and I think it's a relevant point to not forget.)

show 1 reply