Implement CRC16 hash generator based on ext-phpiredis.

Generating the hash of a string of 10 bytes is 10 times faster than
the equivalent pure-PHP implementation of CRC16 (PHP 7.0.7).

This generator requires a version of phpiredis that implements the
function "phpiredis_utils_crc16()".
This commit is contained in:
Daniele Alessandri
2016-06-13 19:04:49 +02:00
parent 0c4a90d809
commit 509a330bca
2 changed files with 85 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
<?php
/*
* This file is part of the Predis package.
*
* (c) Daniele Alessandri <suppakilla@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Predis\Cluster\Hash;
use Predis\NotSupportedException;
/**
* Hash generator implementing the CRC-CCITT-16 algorithm used by redis-cluster.
*
* @author Daniele Alessandri <suppakilla@gmail.com>
*/
class PhpiredisCRC16 implements HashGeneratorInterface
{
/**
*
*/
public function __construct()
{
if (!function_exists('phpiredis_utils_crc16')) {
// @codeCoverageIgnoreStart
throw new NotSupportedException(
'This hash generator requires a compatible version of ext-phpiredis'
);
// @codeCoverageIgnoreEnd
}
}
/**
* {@inheritdoc}
*/
public function hash($value)
{
return phpiredis_utils_crc16($value);
}
}
@@ -0,0 +1,41 @@
<?php
/*
* This file is part of the Predis package.
*
* (c) Daniele Alessandri <suppakilla@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Predis\Cluster\Hash;
use PredisTestCase;
/**
* @group ext-phpiredis
* @requires extension phpiredis
* @requires function phpiredis_utils_crc16
*/
class PhpiredisCRC16Test extends PredisTestCase
{
/**
* @group disconnected
*/
public function testHashGeneration()
{
$crc16 = new PhpiredisCRC16();
$this->assertSame(58359, $crc16->hash('key:000'));
$this->assertSame(62422, $crc16->hash('key:001'));
$this->assertSame(50101, $crc16->hash('key:002'));
$this->assertSame(54164, $crc16->hash('key:003'));
$this->assertSame(41843, $crc16->hash('key:004'));
$this->assertSame(45906, $crc16->hash('key:005'));
$this->assertSame(33585, $crc16->hash('key:006'));
$this->assertSame(37648, $crc16->hash('key:007'));
$this->assertSame(25343, $crc16->hash('key:008'));
$this->assertSame(29406, $crc16->hash('key:009'));
}
}