Entrambi. Se implementi solo uno dei due, rischi (quasi sicuramente) che si "rompa" il contratto che ci deve essere tra equals e hashCode.
Più che primitivi ... al massimo avevi oggetti dei wrapper Integer, ecc.... come chiavi e per queste classi equals/hashCode è già ok e appropriato.