SHA-256: Difference between revisions

Content added Content deleted
(→‎{{header|Racket}}: More compact code)
(→‎{{header|Perl 6}}: using Blob instead of Buf)
Line 365: Line 365:


<lang Perl 6>say .list».fmt("%02x").join given sha256 "Rosetta code";
<lang Perl 6>say .list».fmt("%02x").join given sha256 "Rosetta code";

constant primes = grep &is-prime, 2 .. *;
constant primes = grep &is-prime, 2 .. *;
sub init(&f) {
sub init(&f) {
map { my $f = $^p.&f; (($f - $f.Int)*2**32).Int }, primes
map { my $f = $^p.&f; (($f - $f.Int)*2**32).Int }, primes
}
}

sub infix:<m+> { ($^a + $^b) % 2**32 }
sub infix:<m+> { ($^a + $^b) % 2**32 }
sub rotr($n, $b) { $n +> $b +| $n +< (32 - $b) }
sub rotr($n, $b) { $n +> $b +| $n +< (32 - $b) }

proto sha256($) returns Buf {*}
proto sha256($) returns Blob {*}
multi sha256(Str $str where all($str.ords) < 128) {
multi sha256(Str $str where all($str.ords) < 128) {
sha256 $str.encode: 'ascii'
sha256 $str.encode: 'ascii'
}
}
multi sha256(Buf $data) {
multi sha256(Blob $data) {
constant K = init(* **(1/3))[^64];
constant K = init(* **(1/3))[^64];
my $l = 8 * my @b = $data.list;
my $l = 8 * my @b = $data.list;
push @b, 0x80; push @b, 0 until (8*@b-448) %% 512;
push @b, 0x80; push @b, 0 until (8*@b-448) %% 512;

push @b, reverse gather for ^8 { take $l%256; $l div=256 }
push @b, reverse gather for ^8 { take $l%256; $l div=256 }
my @word = :256[@b.shift xx 4] xx @b/4;
my @word = :256[@b.shift xx 4] xx @b/4;

my @H = init(&sqrt)[^8];
my @H = init(&sqrt)[^8];
my @w;
my @w;
Line 407: Line 407:
@H = @H Z[m+] @h;
@H = @H Z[m+] @h;
}
}
return Buf.new: map -> $word is rw {
return Blob.new: map -> $word is rw {
reverse gather for ^4 { take $word % 256; $word div= 256 }
reverse gather for ^4 { take $word % 256; $word div= 256 }
}, @H;
}, @H;