Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitef2c92a

Browse files
ImplementDIGEST and_digest helper (for php >= 8.1)
Redis implemented new CAS semantics which work both with values and theXXH3 digest of those values.This commit implements the Redis command itself and a helper whichcomputes the XXH3 digest locally. Note that we can only be sure to havethe `XXH3` hashing algorithm in PHP >= 8.1 so the `_digest` helper islimited to PHP 8.1 or newer.
1 parentbf2047e commitef2c92a

11 files changed

+193
-4
lines changed

‎redis.c‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2620,6 +2620,24 @@ PHP_METHOD(Redis, _pack) {
26202620
redis_pack_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU,redis_sock);
26212621
}
26222622

2623+
#ifPHP_VERSION_ID >=80100
2624+
PHP_METHOD(Redis,_digest) {
2625+
RedisSock*redis_sock;
2626+
zval*zv;
2627+
2628+
redis_sock=redis_sock_get_instance(getThis(),0);
2629+
if (redis_sock==NULL) {
2630+
RETURN_FALSE;
2631+
}
2632+
2633+
ZEND_PARSE_PARAMETERS_START(1,1)
2634+
Z_PARAM_ZVAL(zv)
2635+
ZEND_PARSE_PARAMETERS_END();
2636+
2637+
RETURN_STR(redis_digest_handler(redis_sock,zv));
2638+
}
2639+
#endif
2640+
26232641
PHP_METHOD(Redis,_unpack) {
26242642
RedisSock*redis_sock;
26252643

@@ -3180,6 +3198,10 @@ PHP_METHOD(Redis, geosearchstore) {
31803198
REDIS_PROCESS_CMD(geosearchstore,redis_long_response);
31813199
}
31823200

3201+
PHP_METHOD(Redis,digest) {
3202+
REDIS_PROCESS_KW_CMD("DIGEST",redis_key_cmd,redis_ping_response);
3203+
}
3204+
31833205
/*
31843206
* Vectors
31853207
*/

‎redis.stub.php‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,17 @@ public function _unserialize(string $value): mixed;
590590
*/
591591
publicfunction_pack(mixed$value):string;
592592

593+
#if PHP_VERSION_ID >= 80100
594+
595+
/**
596+
* Compute the XXH3 digest of a packed value.
597+
*
598+
* @param mixed $value The value to compute the digest for.
599+
* @return string The computed digest.
600+
*/
601+
publicfunction_digest(mixed$value):string;
602+
#endif
603+
593604
/**
594605
* Unpack the provided value with the configured compressor and serializer
595606
* as set with Redis::setOption().
@@ -5037,6 +5048,16 @@ public function zunion(array $keys, ?array $weights = null, ?array $options = nu
50375048
* $redis->zUnionStore('dst', ['zs1', 'zs2', 'zs3']);
50385049
*/
50395050
publicfunctionzunionstore(string$dst,array$keys, ?array$weights =null, ?string$aggregate =null):Redis|int|false;
5051+
5052+
/**
5053+
* Ask the server for the XXH3 digest of a given key's value
5054+
*
5055+
* @param strinig $key The key to retrieve the digest for.
5056+
* @return Redis|string|false The XXH3 digest as a string or false on failure.
5057+
*/
5058+
publicfunctiondigest(string$key):Redis|string|false;
50405059
}
50415060

5061+
5062+
50425063
class RedisExceptionextends RuntimeException {}

‎redis_arginfo.h‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash:4c712b9de716d8008f7d3b38aa8b7125b08a042b */
2+
* Stub hash:b3bd2917baa5afac66331f28a0d2cdd6a7981083 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct,0,0,0)
55
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0,options,IS_ARRAY,1,"null")
@@ -28,6 +28,12 @@ ZEND_END_ARG_INFO()
2828

2929
#definearginfo_class_Redis__pack arginfo_class_Redis__serialize
3030

31+
#ifPHP_VERSION_ID >=80100
32+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis__digest,0,1,IS_STRING,0)
33+
ZEND_ARG_TYPE_INFO(0,value,IS_MIXED,0)
34+
ZEND_END_ARG_INFO()
35+
#endif
36+
3137
#definearginfo_class_Redis__unpack arginfo_class_Redis__unserialize
3238

3339
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis_acl,0,1,IS_MIXED,0)
@@ -1299,6 +1305,8 @@ ZEND_END_ARG_INFO()
12991305

13001306
#definearginfo_class_Redis_zunionstore arginfo_class_Redis_zinterstore
13011307

1308+
#definearginfo_class_Redis_digest arginfo_class_Redis_dump
1309+
13021310
ZEND_METHOD(Redis,__construct);
13031311
ZEND_METHOD(Redis,__destruct);
13041312
ZEND_METHOD(Redis,_compress);
@@ -1307,6 +1315,9 @@ ZEND_METHOD(Redis, _prefix);
13071315
ZEND_METHOD(Redis,_serialize);
13081316
ZEND_METHOD(Redis,_unserialize);
13091317
ZEND_METHOD(Redis,_pack);
1318+
#ifPHP_VERSION_ID >=80100
1319+
ZEND_METHOD(Redis,_digest);
1320+
#endif
13101321
ZEND_METHOD(Redis,_unpack);
13111322
ZEND_METHOD(Redis,acl);
13121323
ZEND_METHOD(Redis,append);
@@ -1583,6 +1594,7 @@ ZEND_METHOD(Redis, zinterstore);
15831594
ZEND_METHOD(Redis,zscan);
15841595
ZEND_METHOD(Redis,zunion);
15851596
ZEND_METHOD(Redis,zunionstore);
1597+
ZEND_METHOD(Redis,digest);
15861598

15871599
staticconstzend_function_entryclass_Redis_methods[]= {
15881600
ZEND_ME(Redis,__construct,arginfo_class_Redis___construct,ZEND_ACC_PUBLIC)
@@ -1593,6 +1605,9 @@ static const zend_function_entry class_Redis_methods[] = {
15931605
ZEND_ME(Redis,_serialize,arginfo_class_Redis__serialize,ZEND_ACC_PUBLIC)
15941606
ZEND_ME(Redis,_unserialize,arginfo_class_Redis__unserialize,ZEND_ACC_PUBLIC)
15951607
ZEND_ME(Redis,_pack,arginfo_class_Redis__pack,ZEND_ACC_PUBLIC)
1608+
#ifPHP_VERSION_ID >=80100
1609+
ZEND_ME(Redis,_digest,arginfo_class_Redis__digest,ZEND_ACC_PUBLIC)
1610+
#endif
15961611
ZEND_ME(Redis,_unpack,arginfo_class_Redis__unpack,ZEND_ACC_PUBLIC)
15971612
ZEND_ME(Redis,acl,arginfo_class_Redis_acl,ZEND_ACC_PUBLIC)
15981613
ZEND_ME(Redis,append,arginfo_class_Redis_append,ZEND_ACC_PUBLIC)
@@ -1884,6 +1899,7 @@ static const zend_function_entry class_Redis_methods[] = {
18841899
ZEND_ME(Redis,zscan,arginfo_class_Redis_zscan,ZEND_ACC_PUBLIC)
18851900
ZEND_ME(Redis,zunion,arginfo_class_Redis_zunion,ZEND_ACC_PUBLIC)
18861901
ZEND_ME(Redis,zunionstore,arginfo_class_Redis_zunionstore,ZEND_ACC_PUBLIC)
1902+
ZEND_ME(Redis,digest,arginfo_class_Redis_digest,ZEND_ACC_PUBLIC)
18871903
ZEND_FE_END
18881904
};
18891905

‎redis_cluster.c‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2024,6 +2024,19 @@ PHP_METHOD(RedisCluster, _pack) {
20242024
redis_pack_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU,c->flags);
20252025
}
20262026

2027+
#ifPHP_VERSION_ID >=80100
2028+
PHP_METHOD(RedisCluster,_digest) {
2029+
redisCluster*c=GET_CONTEXT();
2030+
zval*zv;
2031+
2032+
ZEND_PARSE_PARAMETERS_START(1,1)
2033+
Z_PARAM_ZVAL(zv)
2034+
ZEND_PARSE_PARAMETERS_END();
2035+
2036+
RETURN_STR(redis_digest_handler(c->flags,zv));
2037+
}
2038+
#endif
2039+
20272040
PHP_METHOD(RedisCluster,_unpack) {
20282041
redisCluster*c=GET_CONTEXT();
20292042
redis_unpack_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU,c->flags);
@@ -3438,5 +3451,9 @@ PHP_METHOD(RedisCluster, copy) {
34383451
CLUSTER_PROCESS_CMD(copy,cluster_1_resp,0);
34393452
}
34403453

3454+
PHP_METHOD(RedisCluster,digest) {
3455+
CLUSTER_PROCESS_KW_CMD("DIGEST",redis_key_cmd,cluster_bulk_raw_resp,1);
3456+
}
3457+
34413458
/* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4: */
34423459

‎redis_cluster.stub.php‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ public function _unserialize(string $value): mixed;
7474
*/
7575
publicfunction_pack(mixed$value):string;
7676

77+
/**
78+
* @see Redis::_digest()
79+
*/
80+
publicfunction_digest(string$value):string;
81+
7782
/**
7883
* @see Redis::_unpack()
7984
*/
@@ -1380,6 +1385,11 @@ public function zunion(array $keys, ?array $weights = null, ?array $options = nu
13801385
* @see https://redis.io/commands/zdiff
13811386
*/
13821387
publicfunctionzdiff(array$keys, ?array$options =null):RedisCluster|array|false;
1388+
1389+
/**
1390+
* @see https://redis.io/commands/digest
1391+
*/
1392+
publicfunctiondigest(string$key):RedisCluster|string|false;
13831393
}
13841394

13851395
class RedisClusterExceptionextends RuntimeException {}

‎redis_cluster_arginfo.h‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash:cd1fe38b8b2078964d1b7f50252f6f931d20fd35 */
2+
* Stub hash:cbff19ce562de44fc7ffc5710508560735db1fd0 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct,0,0,1)
55
ZEND_ARG_TYPE_INFO(0,name,IS_STRING,1)
@@ -29,6 +29,8 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisCluster__pack, 0, 1,
2929
ZEND_ARG_TYPE_INFO(0,value,IS_MIXED,0)
3030
ZEND_END_ARG_INFO()
3131

32+
#definearginfo_class_RedisCluster__digest arginfo_class_RedisCluster__compress
33+
3234
#definearginfo_class_RedisCluster__unpack arginfo_class_RedisCluster__unserialize
3335

3436
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisCluster__prefix,0,1,MAY_BE_BOOL|MAY_BE_STRING)
@@ -1187,12 +1189,15 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_zdiff, 0,
11871189
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0,options,IS_ARRAY,1,"null")
11881190
ZEND_END_ARG_INFO()
11891191

1192+
#definearginfo_class_RedisCluster_digest arginfo_class_RedisCluster_dump
1193+
11901194
ZEND_METHOD(RedisCluster,__construct);
11911195
ZEND_METHOD(RedisCluster,_compress);
11921196
ZEND_METHOD(RedisCluster,_uncompress);
11931197
ZEND_METHOD(RedisCluster,_serialize);
11941198
ZEND_METHOD(RedisCluster,_unserialize);
11951199
ZEND_METHOD(RedisCluster,_pack);
1200+
ZEND_METHOD(RedisCluster,_digest);
11961201
ZEND_METHOD(RedisCluster,_unpack);
11971202
ZEND_METHOD(RedisCluster,_prefix);
11981203
ZEND_METHOD(RedisCluster,_masters);
@@ -1443,6 +1448,7 @@ ZEND_METHOD(RedisCluster, zinter);
14431448
ZEND_METHOD(RedisCluster,zdiffstore);
14441449
ZEND_METHOD(RedisCluster,zunion);
14451450
ZEND_METHOD(RedisCluster,zdiff);
1451+
ZEND_METHOD(RedisCluster,digest);
14461452

14471453
staticconstzend_function_entryclass_RedisCluster_methods[]= {
14481454
ZEND_ME(RedisCluster,__construct,arginfo_class_RedisCluster___construct,ZEND_ACC_PUBLIC)
@@ -1451,6 +1457,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
14511457
ZEND_ME(RedisCluster,_serialize,arginfo_class_RedisCluster__serialize,ZEND_ACC_PUBLIC)
14521458
ZEND_ME(RedisCluster,_unserialize,arginfo_class_RedisCluster__unserialize,ZEND_ACC_PUBLIC)
14531459
ZEND_ME(RedisCluster,_pack,arginfo_class_RedisCluster__pack,ZEND_ACC_PUBLIC)
1460+
ZEND_ME(RedisCluster,_digest,arginfo_class_RedisCluster__digest,ZEND_ACC_PUBLIC)
14541461
ZEND_ME(RedisCluster,_unpack,arginfo_class_RedisCluster__unpack,ZEND_ACC_PUBLIC)
14551462
ZEND_ME(RedisCluster,_prefix,arginfo_class_RedisCluster__prefix,ZEND_ACC_PUBLIC)
14561463
ZEND_ME(RedisCluster,_masters,arginfo_class_RedisCluster__masters,ZEND_ACC_PUBLIC)
@@ -1701,6 +1708,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
17011708
ZEND_ME(RedisCluster,zdiffstore,arginfo_class_RedisCluster_zdiffstore,ZEND_ACC_PUBLIC)
17021709
ZEND_ME(RedisCluster,zunion,arginfo_class_RedisCluster_zunion,ZEND_ACC_PUBLIC)
17031710
ZEND_ME(RedisCluster,zdiff,arginfo_class_RedisCluster_zdiff,ZEND_ACC_PUBLIC)
1711+
ZEND_ME(RedisCluster,digest,arginfo_class_RedisCluster_digest,ZEND_ACC_PUBLIC)
17041712
ZEND_FE_END
17051713
};
17061714

‎redis_cluster_legacy_arginfo.h‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash:cd1fe38b8b2078964d1b7f50252f6f931d20fd35 */
2+
* Stub hash:cbff19ce562de44fc7ffc5710508560735db1fd0 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct,0,0,1)
55
ZEND_ARG_INFO(0,name)
@@ -23,6 +23,8 @@ ZEND_END_ARG_INFO()
2323

2424
#definearginfo_class_RedisCluster__pack arginfo_class_RedisCluster__compress
2525

26+
#definearginfo_class_RedisCluster__digest arginfo_class_RedisCluster__compress
27+
2628
#definearginfo_class_RedisCluster__unpack arginfo_class_RedisCluster__compress
2729

2830
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster__prefix,0,0,1)
@@ -1016,12 +1018,15 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_zdiff, 0, 0, 1)
10161018
ZEND_ARG_INFO(0,options)
10171019
ZEND_END_ARG_INFO()
10181020

1021+
#definearginfo_class_RedisCluster_digest arginfo_class_RedisCluster__prefix
1022+
10191023
ZEND_METHOD(RedisCluster,__construct);
10201024
ZEND_METHOD(RedisCluster,_compress);
10211025
ZEND_METHOD(RedisCluster,_uncompress);
10221026
ZEND_METHOD(RedisCluster,_serialize);
10231027
ZEND_METHOD(RedisCluster,_unserialize);
10241028
ZEND_METHOD(RedisCluster,_pack);
1029+
ZEND_METHOD(RedisCluster,_digest);
10251030
ZEND_METHOD(RedisCluster,_unpack);
10261031
ZEND_METHOD(RedisCluster,_prefix);
10271032
ZEND_METHOD(RedisCluster,_masters);
@@ -1272,6 +1277,7 @@ ZEND_METHOD(RedisCluster, zinter);
12721277
ZEND_METHOD(RedisCluster,zdiffstore);
12731278
ZEND_METHOD(RedisCluster,zunion);
12741279
ZEND_METHOD(RedisCluster,zdiff);
1280+
ZEND_METHOD(RedisCluster,digest);
12751281

12761282
staticconstzend_function_entryclass_RedisCluster_methods[]= {
12771283
ZEND_ME(RedisCluster,__construct,arginfo_class_RedisCluster___construct,ZEND_ACC_PUBLIC)
@@ -1280,6 +1286,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
12801286
ZEND_ME(RedisCluster,_serialize,arginfo_class_RedisCluster__serialize,ZEND_ACC_PUBLIC)
12811287
ZEND_ME(RedisCluster,_unserialize,arginfo_class_RedisCluster__unserialize,ZEND_ACC_PUBLIC)
12821288
ZEND_ME(RedisCluster,_pack,arginfo_class_RedisCluster__pack,ZEND_ACC_PUBLIC)
1289+
ZEND_ME(RedisCluster,_digest,arginfo_class_RedisCluster__digest,ZEND_ACC_PUBLIC)
12831290
ZEND_ME(RedisCluster,_unpack,arginfo_class_RedisCluster__unpack,ZEND_ACC_PUBLIC)
12841291
ZEND_ME(RedisCluster,_prefix,arginfo_class_RedisCluster__prefix,ZEND_ACC_PUBLIC)
12851292
ZEND_ME(RedisCluster,_masters,arginfo_class_RedisCluster__masters,ZEND_ACC_PUBLIC)
@@ -1530,6 +1537,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
15301537
ZEND_ME(RedisCluster,zdiffstore,arginfo_class_RedisCluster_zdiffstore,ZEND_ACC_PUBLIC)
15311538
ZEND_ME(RedisCluster,zunion,arginfo_class_RedisCluster_zunion,ZEND_ACC_PUBLIC)
15321539
ZEND_ME(RedisCluster,zdiff,arginfo_class_RedisCluster_zdiff,ZEND_ACC_PUBLIC)
1540+
ZEND_ME(RedisCluster,digest,arginfo_class_RedisCluster_digest,ZEND_ACC_PUBLIC)
15331541
ZEND_FE_END
15341542
};
15351543

‎redis_commands.c‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
+----------------------------------------------------------------------+
1717
*/
1818

19+
#include"hash/php_hash.h"
1920
#ifdefHAVE_CONFIG_H
2021
#include"config.h"
2122
#endif
@@ -7489,6 +7490,45 @@ void redis_pack_handler(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock) {
74897490
if (valfree)efree(val);
74907491
}
74917492

7493+
#ifPHP_VERSION_ID >=80100
7494+
zend_string*redis_digest_handler(RedisSock*redis_sock,zval*zv) {
7495+
zend_string*algo,*hex;
7496+
constphp_hash_ops*ops;
7497+
unsignedchar*digest;
7498+
intvalfree;
7499+
size_tlen;
7500+
char*val;
7501+
void*ctx;
7502+
7503+
algo=zend_string_init(ZEND_STRL("XXH3"),0);
7504+
ops=php_hash_fetch_ops(algo);
7505+
if (ops==NULL) {
7506+
zend_string_release(algo);
7507+
returnNULL;
7508+
}
7509+
7510+
valfree=redis_pack(redis_sock,zv,&val,&len);
7511+
7512+
ctx=emalloc(ops->context_size);
7513+
ops->hash_init(ctx,NULL);
7514+
ops->hash_update(ctx, (constunsignedchar*)val,len);
7515+
7516+
digest=emalloc(ops->digest_size);
7517+
ops->hash_final(digest,ctx);
7518+
7519+
hex=zend_string_safe_alloc(ops->digest_size,2,0,0);
7520+
php_hash_bin2hex(ZSTR_VAL(hex),digest,ops->digest_size);
7521+
ZSTR_VAL(hex)[ZSTR_LEN(hex)]='\0';
7522+
7523+
efree(ctx);
7524+
efree(digest);
7525+
if (valfree)efree(val);
7526+
zend_string_release(algo);
7527+
7528+
returnhex;
7529+
}
7530+
#endif
7531+
74927532
voidredis_unpack_handler(INTERNAL_FUNCTION_PARAMETERS,RedisSock*redis_sock) {
74937533
zend_string*str;
74947534

‎redis_commands.h‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,10 @@ void redis_uncompress_handler(INTERNAL_FUNCTION_PARAMETERS,
456456
voidredis_pack_handler(INTERNAL_FUNCTION_PARAMETERS,RedisSock*redis_sock);
457457
voidredis_unpack_handler(INTERNAL_FUNCTION_PARAMETERS,RedisSock*redis_sock);
458458

459+
#ifPHP_VERSION_ID >=80100
460+
zend_string*redis_digest_handler(RedisSock*redis_sock,zval*zv);
461+
#endif
462+
459463
#endif
460464

461465
/* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4: */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp