File Coverage

blib/lib/Hashids/Util.pm
Criterion Covered Total %
statement 52 52 100.0
branch 14 14 100.0
condition n/a
subroutine 13 13 100.0
pod 5 5 100.0
total 84 84 100.0


line stmt bran cond sub pod time code
1             package Hashids::Util;
2              
3 6     6   66115 use strict;
  6         22  
  6         171  
4 6     6   29 use warnings;
  6         13  
  6         278  
5              
6             our ( @EXPORT_OK, %EXPORT_TAGS );
7              
8             BEGIN {
9 6     6   29 use Exporter 'import';
  6         12  
  6         352  
10 6     6   36 @EXPORT_OK = qw(consistent_shuffle to_alphabet from_alphabet any bignum);
11 6         152 %EXPORT_TAGS = ( all => \@EXPORT_OK );
12             }
13              
14 6     6   33 use List::Util 'reduce';
  6         19  
  6         581  
15 6     6   5857 use Math::BigInt;
  6         141050  
  6         32  
16              
17 6     6   130763 use namespace::clean -except => [qw(import)];
  6         88042  
  6         45  
18              
19             sub consistent_shuffle {
20 3232     3232 1 13112 my ( $alphabet, $salt ) = @_;
21              
22 3232 100       7301 return ('') unless $alphabet;
23              
24             my @alphabet
25 3231 100       26098 = ref $alphabet eq 'ARRAY' ? @$alphabet : split // => $alphabet;
26 3231 100       6912 return @alphabet unless $salt;
27 3216 100       24387 my @salt = ref $salt eq 'ARRAY' ? @$salt : split //, $salt;
28              
29 3216         10130 for ( my ( $i, $v, $p ) = ( $#alphabet, 0, 0 ); $i > 0; $i--, $v++ ) {
30 136919         192471 $p += my $int = ord $salt[ $v %= @salt ];
31 136919         187289 my $j = ( $int + $v + $p ) % $i;
32              
33 136919         297295 @alphabet[ $j, $i ] = @alphabet[ $i, $j ];
34             }
35              
36 3216         46572 @alphabet;
37             }
38              
39             sub to_alphabet {
40 2113     2113 1 8839 my ( $num, $alphabet ) = @_;
41              
42 2113         3383 my $hash = '';
43             my @alphabet
44 2113 100       15127 = ref $alphabet eq 'ARRAY' ? @$alphabet : split // => $alphabet;
45              
46 2113         3740 $num = bignum($num);
47 2113         315632 do {
48 4311         985734 $hash = $alphabet[ $num % @alphabet ] . $hash;
49 4311         878792 $num = int($num / @alphabet);
50             } while ( $num != 0 );
51              
52 2113         935273 $hash;
53             }
54              
55             sub from_alphabet {
56 1053     1053 1 2526 my ( $hash, $alphabet ) = @_;
57              
58             my @alphabet
59 1053 100       7280 = ref $alphabet eq 'ARRAY' ? @$alphabet : split // => $alphabet;
60              
61 1103     1103   49980 my $num = reduce { bignum($a) * @alphabet + $b }
62 1053         5696 map { index join( '' => @alphabet ), $_ } split // => $hash;
  2156         11073  
63              
64 1053         443945 "$num";
65             }
66              
67             sub any (&@) { ## no critic (ProhibitSubroutinePrototypes)
68 357     357 1 10039 my $f = shift;
69 357         588 for (@_) {
70 27207 100       71013 return 1 if $f->();
71             }
72 50         654 0;
73             }
74              
75             sub bignum {
76 9508     9508 1 25470 my $n = Math::BigInt->bzero();
77 9508         400231 $n->round_mode('zero');
78 9508         124963 $n->badd("@{[shift]}");
  9508         32356  
79             }
80              
81             1;
82             __END__