Multiplying by 33 does two things: it pushes the old hash aside, to the left, which leaves 5 zeros on the right. Then it adds a copy of the old hash to fill in those zeros. This is shown in the C code by the shift and add, which are used to speed the function's response. But why 33 and not 17 or 65? ASCII alphabet letters a-z have the value 0-26 in the 5 rightmost bits. This span is cleared by a 5-bit shift, but not a 4-bit shift. And a 6-bit shift (64) would not be as compact or frugal hash.