mirror of
https://github.com/predis/predis.git
synced 2026-09-12 03:17:22 +00:00
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:
@@ -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'));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user