The custom hash is adding the unicode values of each character, the amount of rows and the amount of characters each multiplied with a hex value. This leads to it giving the same output when switching around rows, or even putting all characters into one line and adding the required amount of empty lines behind that. """ LJVeuiolknitaaornrdia """ is producing the same hash as """ Leonard Viktoria Julian """ and the same as """ Julian Leonard Viktoria """ It has a good enough "first pre-image resistance" since it is not really possible to find the correct characters in the same order from the hash value that give the same original file The "second pre-image resistance" is weak since you can easily calculate a different file which gives the same output. It has no collision resistance since you can just switch around characters and get the same hash.