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 |
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( |
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 |
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; |