MD5/Implementation: Difference between revisions
m
→{{header|Raku}}: minor simplification
(→{{header|Scala}}: delete the incorrect version, add a port of Java code in Scala.) |
m (→{{header|Raku}}: minor simplification) |
||
(One intermediate revision by one other user not shown) | |||
Line 4,812:
=={{header|Raku}}==
(formerly Perl 6)
{{works with|rakudo|
<syntaxhighlight lang="raku" line>proto md5($msg) returns Blob is export {*}
multi md5(Str $msg) { md5 $msg.encode }
multi md5(Blob $msg) {
my buf8 $buf .= new;
$buf.write-uint32: $buf.elems, $_, LittleEndian for
Line 4,844 ⟶ 4,843:
|map { blob32.new: @$_ },
{
$^b.push(blob8.new(@$_).read-uint32(0)) for (@$msg, 0x80, 0x00 xx (-(
.flat.rotor(4);
$b.write-uint64: $b.elems,
$b;
}(buf32.new)
Line 5,683 ⟶ 5,682:
const array integer: k is createMd5Table;
var integer: length is 0;
var integer:
var integer: index is 0;
var array bin32: m is 16 times bin32.value;
Line 5,704 ⟶ 5,703:
message &:= "\0;" mult 63 - (length + 8) mod 64;
# Append length of message (before pre-processing), in bits, as 64-bit little-endian integer.
message &:=
# Process the message in successive 512-bit chunks:
# Break chunk into sixteen 32-bit little-endian words.
for index range 1 to 16 do
m[index] := bin32(bytes2Int(message[
wordIndex +:= 4;
end for;
Line 5,724:
elsif index <= 32 then
f := c >< (d & (b >< c));
g := succ((5 * index - 4) mod 16
elsif index <= 48 then
f := b >< c >< d;
g := succ((3 * index + 2) mod 16
else
f := c >< (b | (bin32(16#ffffffff) >< d));
g := succ((7 * pred(index)) mod 16
end if;
Line 5,747:
c0 +:= ord(c);
d0 +:= ord(d);
end
# Produce the final hash value:
digest :=
end func;
|