瀏覽代碼

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()".
Daniele Alessandri 8 年之前
父節點
當前提交
509a330bca
共有 2 個文件被更改,包括 85 次插入0 次删除
  1. 44 0
      src/Cluster/Hash/PhpiredisCRC16.php
  2. 41 0
      tests/Predis/Cluster/Hash/PhpiredisCRC16Test.php

+ 44 - 0
src/Cluster/Hash/PhpiredisCRC16.php

@@ -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);
+    }
+}

+ 41 - 0
tests/Predis/Cluster/Hash/PhpiredisCRC16Test.php

@@ -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'));
+    }
+}