Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
Mash
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 3
20
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 mash
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
6
 version
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2declare( strict_types = 1 );
3
4namespace Wikimedia\Alea;
5
6/**
7 * This is a helper class which just takes a bunch of mixed seed content
8 * and smushes it together to create a single numeric seed.
9 */
10class Mash {
11
12    /** @var int */
13    private $n;
14
15    public function __construct() {
16        $this->n = 0xefc8249d;
17    }
18
19    /**
20     * Mash in some more data.
21     * @param mixed $data Anything that can be an argument to `strval`.
22     * @return float The current mash
23     */
24    public function mash( $data ): float {
25        $data = strval( $data );
26        $data = mb_convert_encoding( $data, 'ucs-2' );
27        $n = $this->n;
28        for ( $i = 0;  $i < strlen( $data );  $i += 2 ) {
29            $charCode = ord( $data[$i] ) * 256 + ord( $data[$i + 1] );
30            $n += $charCode;
31            $h = 0.02519603282416938 * $n;
32            $n = intval( $h );
33            $h -= $n;
34            $h *= $n;
35            $n = intval( $h );
36            $h -= $n;
37            $n += $h * 0x100000000; // 2^32
38        }
39        $this->n = $n;
40        return intval( $n ) * 2.3283064365386963e-10; // 2^-32
41    }
42
43    public static function version(): string {
44        return 'Mash 0.9';
45    }
46}