I'm also a -0 on a `.read()`… It's probably what I'd do in my code too, but for a library, I feel like it should be done "right":

```python
h = hashlib.md5()
with open(s) as f:
    for hunk in iter(lambda: f.read(4096), ""):
        h.update(hunk)
return h.hexdigest()
```