妄想案

use Digest::SHA qw(sha512_base64);

$in = 'ff0123456789abcdef0123456789abcdef';
($pos, $in) = $in =~ /^([0-9A-Fa-f]{2})([0-9A-Fa-f]{32})/;

$sha = Digest::SHA->new('sha512');

$digest1 = sha512_base64(hex substr $in, 0, 16);
$digest2 = sha512_base64(hex substr $in, 8, 16);
$digest3 = sha512_base64(hex substr $in, 16, 16);

$digest4 = sprintf q|%s%s%s%s|,
sha512_base64($digest1 . $digest2 . $digest3),
sha512_base64($digest1 . $digest2),
sha512_base64($digest1 . $digest3),
sha512_base64($digest2 . $digest3),
;
$digest4 =~ tr/+/./;
$digest4 = substr $digest4, 0, 255 + 12;

printf qq|IN:%s¥n|, $in;

printf qq|HASH1:%s¥n|, $digest1;
printf qq|HASH2:%s¥n|, $digest2;
printf qq|HASH3:%s¥n|, $digest3;
printf qq|HASH4:%s¥n|, $digest4;
printf qq|LEN:%d¥n|, length $digest4;
printf qq|POS:%d¥n|, hex $pos;

printf qq|STR:%s¥n|, substr $digest4, hex $pos, 12;