This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #32193] Tie::RefHash DELETE does not return value for ref keys
[perl5.git] / lib / Tie / SubstrHash.pm
index b8f6449..476dd68 100644 (file)
@@ -1,5 +1,7 @@
 package Tie::SubstrHash;
 
+our $VERSION = '1.00';
+
 =head1 NAME
 
 Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing
@@ -45,7 +47,7 @@ sub TIEHASH {
     my $rlen = 1 + $klen + $vlen;
     $tsize = [$tsize,
              findgteprime($tsize * 1.1)]; # Allow 10% empty.
-    $self = bless ["\0", $klen, $vlen, $tsize, $rlen, 0, -1];
+    local $self = bless ["\0", $klen, $vlen, $tsize, $rlen, 0, -1];
     $$self[0] x= $rlen * $tsize->[1];
     $self;
 }
@@ -181,6 +183,11 @@ sub ceil {
     return $num;
 }
 
+# See:
+#
+# http://www-groups.dcs.st-andrews.ac.uk/~history/HistTopics/Prime_numbers.html
+#
+
 sub findgteprime { # find the smallest prime integer greater than or equal to
     use integer;
 
@@ -188,15 +195,20 @@ sub findgteprime { # find the smallest prime integer greater than or equal to
     return 2 if $num <= 2;
 
     $num++ unless $num % 2;
-
-    my $max = int sqrt $num;
+    my $i;
+    my $sqrtnum = int sqrt $num;
+    my $sqrtnumsquared = $sqrtnum * $sqrtnum;
 
   NUM:
     for (;; $num += 2) {
-       for ($i = 3; $i <= $max; $i += 2) {
-           next NUM unless $num % $i;
+       if ($sqrtnumsquared < $num) {
+           $sqrtnum++;
+           $sqrtnumsquared = $sqrtnum * $sqrtnum;
        }
-       return $num;
+        for ($i = 3; $i <= $sqrtnum; $i += 2) {
+            next NUM unless $num % $i;
+        }
+        return $num;
     }
 }