Help to make (and understand) better and beautiful code

Years ago i worte keccak_ex with only support for hash 256

Now I completed the support for hash 512 and 128 bytes

The “problem”
Both implementation are the same ( :upside_down_face: copy and paste) and just change

for hash 256

  @digest_length 32

  @block_length 200 - 2 * @digest_length

for hash 512

  @digest_length 64

  @block_length 200 - 2 * @digest_length

i thik something like an “interface/inheritance” can help with all the duplicated code making an isolation with the concret type but i cant find anything like that

the other problematic line is

defp process_block_decode_loop(%__MODULE__{} = value, index) when index < @block_length do

because you need the block_length to make the loop work…

i appretiate any idea/insight/suggestion to make the code looks better and to learn a better way

if i understood it correctly the struct that you’re using seems to be an internal abstraction. so why not internalize the digest_length and the block_length in the struct, this way you can always have it available on the function head by just destructing it and keep the same guard validations.

Are you sure you got all the references? This take(134) seems extremely suspicious - it’s two less than @block_length for @digest_length == 32 in 256-bit, but not changed for 512-bit where @digest_length is different.

Your right!!! also that pointed me to an edge case…

The correct version is:

  defp padding(%__MODULE__{} = value) do
    fix = if (value.input_length + 1) == byte_size(value.buffer) do
      value.buffer
      |> binary_part(0, value.input_length)
      |> set_value(<<0x81>>)

Nice one, already applied, thanks!!!