Skip to content

Commit 7b51423

Browse files
committed
blake3 portable + upstream-support
this is a significantly smaller alternative to the PR at php#6358 , now blake3 "portable c" version is bundled (specifically version 0.3.7 plus a few patches that will be part of the 0.3.8 release..), and ./configure supports a new optional --with-blake3-upstream-c-source-dir=DIR argument for specifying the location of the upstream BLAKE3 C implementation, if invoked, the SSE2/SSE4.1/AVX2/AVX512 optimized versions of BLAKE3 will be compiled in when applicable (this has not been added to MSVC, i don't know how to do it on MSVC, and i don't have a MSVC system to figure it out out on, if someone think getting those optimizations available on MSVC is important, take it up with the windows php mailing list.. just getting the portable version to compile on MSVC was good enough for me.) also userland scripts can detect at runtime if the portable version or the upstream version, of BLAKE was compiled by consulting phpinfo(), it will either say "blake3 implementation: portable 0.3.7" or "blake3 implementation: upstream X.X.X"
1 parent e12f7e3 commit 7b51423

16 files changed

+247
-6
lines changed

build/php.m4

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2703,3 +2703,83 @@ AC_DEFUN([PHP_PATCH_CONFIG_HEADERS], [
27032703
$SED -e 's/^#undef PACKAGE_[^ ]*/\/\* & \*\//g' < $srcdir/$1 \
27042704
> $srcdir/$1.tmp && mv $srcdir/$1.tmp $srcdir/$1
27052705
])
2706+
2707+
2708+
2709+
2710+
2711+
dnl
2712+
dnl PHP_CHECK_X86_TARGET
2713+
dnl
2714+
dnl check if we're compiling for x86/x86_64
2715+
dnl
2716+
AC_DEFUN([PHP_CHECK_X86_TARGET], [
2717+
AC_CACHE_CHECK([for x86 target],ac_cv_target_x86,[
2718+
AC_RUN_IFELSE([AC_LANG_SOURCE([[
2719+
int main(void) {
2720+
#if defined(__x86_64__) || defined(__i386__)
2721+
return 0;
2722+
#else
2723+
return 1;
2724+
#endif
2725+
}
2726+
]])],[
2727+
ac_cv_target_x86=yes
2728+
],[
2729+
ac_cv_target_x86=no
2730+
],[
2731+
ac_cv_target_x86=no
2732+
])])
2733+
2734+
])
2735+
2736+
2737+
dnl
2738+
dnl PHP_CHECK_WINDOWS_TARGET
2739+
dnl
2740+
dnl check if we're compiling for windows
2741+
dnl
2742+
AC_DEFUN([PHP_CHECK_WINDOWS_TARGET], [
2743+
AC_CACHE_CHECK([for windows target],ac_cv_target_windows,[
2744+
AC_RUN_IFELSE([AC_LANG_SOURCE([[
2745+
int main(void) {
2746+
#if defined(_WIN32)
2747+
return 0;
2748+
#else
2749+
return 1;
2750+
#endif
2751+
}
2752+
]])],[
2753+
ac_cv_target_windows=yes
2754+
],[
2755+
ac_cv_target_windows=no
2756+
],[
2757+
ac_cv_target_windows=no
2758+
])])
2759+
2760+
])
2761+
2762+
dnl
2763+
dnl PHP_CHECK_UNIX_TARGET
2764+
dnl
2765+
dnl check if we're compiling for a unix-ish target
2766+
dnl
2767+
AC_DEFUN([PHP_CHECK_UNIX_TARGET], [
2768+
AC_CACHE_CHECK([for unix-ish target],ac_cv_target_unix,[
2769+
AC_RUN_IFELSE([AC_LANG_SOURCE([[
2770+
int main(void) {
2771+
#if defined(unix) || defined(__unix) || defined(__unix__)
2772+
return 0;
2773+
#else
2774+
return 1;
2775+
#endif
2776+
}
2777+
]])],[
2778+
ac_cv_target_unix=yes
2779+
],[
2780+
ac_cv_target_unix=no
2781+
],[
2782+
ac_cv_target_unix=no
2783+
])])
2784+
2785+
])

configure.ac

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,15 @@ PHP_EBCDIC
324324
dnl Check whether the system byte ordering is bigendian.
325325
PHP_C_BIGENDIAN
326326

327+
dnl Check if we're targeting x86 / x86_64
328+
PHP_CHECK_X86_TARGET
329+
330+
dnl Check if we're targeting Windows
331+
PHP_CHECK_WINDOWS_TARGET
332+
333+
dnl Check whether we're targeting a unix-ish system
334+
PHP_CHECK_UNIX_TARGET
335+
327336
dnl Check whether writing to stdout works.
328337
PHP_TEST_WRITE_STDOUT
329338

ext/hash/blake3/blake3.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
#include "blake3.h"
66
#include "blake3_impl.h"
77

8+
const char * blake3_version(void) {
9+
return BLAKE3_VERSION_STRING;
10+
}
11+
812
INLINE void chunk_state_init(blake3_chunk_state *self, const uint32_t key[8],
913
uint8_t flags) {
1014
memcpy(self->cv, key, BLAKE3_KEY_LEN);

ext/hash/blake3/blake3.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
extern "C" {
99
#endif
1010

11+
#define BLAKE3_VERSION_STRING "0.3.7"
1112
#define BLAKE3_KEY_LEN 32
1213
#define BLAKE3_OUT_LEN 32
1314
#define BLAKE3_BLOCK_LEN 64
@@ -38,6 +39,7 @@ typedef struct {
3839
uint8_t cv_stack[(BLAKE3_MAX_DEPTH + 1) * BLAKE3_OUT_LEN];
3940
} blake3_hasher;
4041

42+
const char * blake3_version(void);
4143
void blake3_hasher_init(blake3_hasher *self);
4244
void blake3_hasher_init_keyed(blake3_hasher *self,
4345
const uint8_t key[BLAKE3_KEY_LEN]);

ext/hash/config.m4

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,28 @@ if test "$PHP_MHASH" != "no"; then
1111
AC_DEFINE(PHP_MHASH_BC, 1, [ ])
1212
fi
1313

14+
15+
16+
PHP_ARG_WITH([blake3-upstream-c-source-dir],
17+
[for upstream blake3 implementation, github.com/blake3-team/BLAKE3/tree/0.3.7/c ],
18+
[AS_HELP_STRING([[--with-blake3-upstream-c-source-dir=DIR]],
19+
[Include upstream blake3 source code, github.com/blake3-team/BLAKE3/tree/0.3.7/c])],
20+
"", "")
21+
22+
if test "$PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR" = ""; then
23+
EXT_HASH_BLAKE3_SOURCES="hash_blake3.c blake3/blake3.c blake3/blake3_dispatch.c blake3/blake3_portable.c"
24+
EXT_HASH_BLAKE3_CFLAGS="-I@ext_srcdir@/blake3"
25+
PHP_ADD_BUILD_DIR(ext/hash/blake3, 1)
26+
else
27+
AC_DEFINE(PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR, $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR, [ ])
28+
EXT_HASH_BLAKE3_SOURCES="hash_blake3.c $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3.c $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_dispatch.c $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_portable.c"
29+
PHP_ADD_BUILD_DIR($PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR, 1)
30+
EXT_HASH_BLAKE3_CFLAGS="-I$PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR"
31+
fi
32+
33+
1434
if test $ac_cv_c_bigendian_php = yes; then
35+
dnl todo: check if $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_neon.c is applicable ?
1536
EXT_HASH_SHA3_SOURCES="hash_sha3.c"
1637
AC_DEFINE(HAVE_SLOW_HASH3, 1, [Define is hash3 algo is available])
1738
AC_MSG_WARN("Use SHA3 slow implementation on bigendian")
@@ -20,26 +41,53 @@ else
2041
AC_MSG_CHECKING([if we're at 64-bit platform])
2142
AS_IF([test "$ac_cv_sizeof_long" -eq 4],[
2243
AC_MSG_RESULT([no])
44+
if test $ac_cv_target_x86 = yes; then
45+
dnl i think there are some 32bit x86 cpus with SSE2 but.. cba
46+
EXT_HASH_BLAKE3_CFLAGS="$EXT_HASH_BLAKE3_CFLAGS -DBLAKE3_NO_SSE2 -DBLAKE3_NO_SSE41 -DBLAKE3_NO_AVX2 -DBLAKE3_NO_AVX512"
47+
fi
2348
SHA3_DIR="sha3/generic32lc"
2449
SHA3_OPT_SRC="$SHA3_DIR/KeccakP-1600-inplace32BI.c"
2550
],[
2651
AC_MSG_RESULT([yes])
2752
SHA3_DIR="sha3/generic64lc"
2853
SHA3_OPT_SRC="$SHA3_DIR/KeccakP-1600-opt64.c"
54+
if test $ac_cv_target_x86 = yes; then
55+
if test "$PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR" = ""; then
56+
dnl AC_MSG_WARN("Use BLAKE3 slow/portable implementation")
57+
EXT_HASH_BLAKE3_CFLAGS="$EXT_HASH_BLAKE3_CFLAGS -DBLAKE3_NO_SSE2 -DBLAKE3_NO_SSE41 -DBLAKE3_NO_AVX2 -DBLAKE3_NO_AVX512"
58+
else
59+
if test $ac_cv_target_windows = yes; then
60+
dnl x86_64 windows gnuc
61+
EXT_HASH_BLAKE3_SOURCES="$EXT_HASH_BLAKE3_SOURCES $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_avx512_x86-64_windows_gnu.S $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_avx2_x86-64_windows_gnu.S $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_sse41_x86-64_windows_gnu.S $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_sse2_x86-64_windows_gnu.S"
62+
else
63+
if test $ac_cv_target_unix = yes; then
64+
dnl x86_64 unix gnuc
65+
EXT_HASH_BLAKE3_SOURCES="$EXT_HASH_BLAKE3_SOURCES $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_avx512_x86-64_unix.S $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_avx2_x86-64_unix.S $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_sse41_x86-64_unix.S $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_sse2_x86-64_unix.S"
66+
else
67+
dnl blake still has C instrictics versions (eg $PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR/blake3_avx512.c ) which COULD be used in this situation,
68+
dnl we're targeting x86_64 but neither windows nor unix-ish..
69+
dnl i have nothing to test this on, so i'm just disabling it for now, feel free to fix it.
70+
EXT_HASH_BLAKE3_CFLAGS="$EXT_HASH_BLAKE3_CFLAGS -DBLAKE3_NO_SSE2 -DBLAKE3_NO_SSE41 -DBLAKE3_NO_AVX2 -DBLAKE3_NO_AVX512"
71+
fi
72+
fi
73+
fi
74+
fi
2975
])
3076
EXT_HASH_SHA3_SOURCES="$SHA3_OPT_SRC $SHA3_DIR/KeccakHash.c $SHA3_DIR/KeccakSponge.c hash_sha3.c"
3177
PHP_HASH_CFLAGS="-I@ext_srcdir@/$SHA3_DIR -DKeccakP200_excluded -DKeccakP400_excluded -DKeccakP800_excluded -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"
3278

3379
PHP_ADD_BUILD_DIR(ext/hash/$SHA3_DIR, 1)
3480
fi
81+
PHP_HASH_CFLAGS="$PHP_HASH_CFLAGS $EXT_HASH_BLAKE3_CFLAGS"
3582

3683
EXT_HASH_SOURCES="hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c \
3784
hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c hash_adler32.c \
38-
hash_crc32.c hash_fnv.c hash_joaat.c $EXT_HASH_SHA3_SOURCES"
85+
hash_crc32.c hash_fnv.c hash_joaat.c $EXT_HASH_SHA3_SOURCES \
86+
$EXT_HASH_BLAKE3_SOURCES"
3987
EXT_HASH_HEADERS="php_hash.h php_hash_md.h php_hash_sha.h php_hash_ripemd.h \
4088
php_hash_haval.h php_hash_tiger.h php_hash_gost.h php_hash_snefru.h \
4189
php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h \
42-
php_hash_fnv.h php_hash_joaat.h php_hash_sha3.h"
90+
php_hash_fnv.h php_hash_joaat.h php_hash_sha3.h php_hash_blake3.h"
4391

4492
PHP_NEW_EXTENSION(hash, $EXT_HASH_SOURCES, 0,,$PHP_HASH_CFLAGS)
4593
PHP_INSTALL_HEADERS(ext/hash, $EXT_HASH_HEADERS)

ext/hash/config.w32

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ PHP_HASH = 'yes';
1111
EXTENSION('hash', 'hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c ' +
1212
'hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c ' +
1313
'hash_adler32.c hash_crc32.c hash_joaat.c hash_fnv.c ' +
14-
'hash_sha3.c', false);
14+
'hash_sha3.c hash_blake3.c', false);
15+
16+
ADD_SOURCES('ext/hash/blake3', 'blake3.c blake3_dispatch.c blake3_portable.c');
1517

1618
var hash_sha3_dir = 'ext/hash/sha3/generic' + (X64 ? '64' : '32') + 'lc';
1719

@@ -26,9 +28,11 @@ if (!CHECK_HEADER_ADD_INCLUDE('KeccakHash.h', 'CFLAGS_HASH', hash_sha3_dir)) {
2628
ERROR('Unable to locate SHA3 headers');
2729
}
2830

29-
ADD_FLAG('CFLAGS_HASH', '/DKeccakP200_excluded /DKeccakP400_excluded /DKeccakP800_excluded /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
31+
ADD_FLAG('CFLAGS_HASH', '/DKeccakP200_excluded /DKeccakP400_excluded /DKeccakP800_excluded /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 ' +
32+
'/DBLAKE3_NO_SSE2 /DBLAKE3_NO_SSE41 /DBLAKE3_NO_AVX2 /DBLAKE3_NO_AVX512');
3033

3134
PHP_INSTALL_HEADERS('ext/hash/', 'php_hash.h php_hash_md.h php_hash_sha.h ' +
3235
'php_hash_ripemd.h php_hash_haval.h php_hash_tiger.h ' +
3336
'php_hash_gost.h php_hash_snefru.h php_hash_whirlpool.h ' +
34-
'php_hash_adler32.h php_hash_crc32.h php_hash_sha3.h');
37+
'php_hash_adler32.h php_hash_crc32.h php_hash_sha3.h ' +
38+
'php_hash_blake3.h');

ext/hash/hash.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "config.h"
2020
#endif
2121

22+
#include "blake3.h"
23+
2224
#include <math.h>
2325
#include "php_hash.h"
2426
#include "ext/standard/info.h"
@@ -1586,6 +1588,7 @@ PHP_MINIT_FUNCTION(hash)
15861588
php_hash_register_algo("fnv164", &php_hash_fnv164_ops);
15871589
php_hash_register_algo("fnv1a64", &php_hash_fnv1a64_ops);
15881590
php_hash_register_algo("joaat", &php_hash_joaat_ops);
1591+
php_hash_register_algo("blake3", &php_hash_blake3_ops);
15891592

15901593
PHP_HASH_HAVAL_REGISTER(3,128);
15911594
PHP_HASH_HAVAL_REGISTER(3,160);
@@ -1650,6 +1653,11 @@ PHP_MINFO_FUNCTION(hash)
16501653
php_info_print_table_start();
16511654
php_info_print_table_row(2, "hash support", "enabled");
16521655
php_info_print_table_row(2, "Hashing Engines", buffer);
1656+
#ifdef PHP_BLAKE3_UPSTREAM_C_SOURCE_DIR
1657+
php_info_print_table_row(2, "blake3 implementation", "upstream " BLAKE3_VERSION_STRING);
1658+
#else
1659+
php_info_print_table_row(2, "blake3 implementation", "portable " BLAKE3_VERSION_STRING);
1660+
#endif
16531661
php_info_print_table_end();
16541662

16551663
#ifdef PHP_MHASH_BC

ext/hash/hash_blake3.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "php_hash.h"
2+
#include "php_hash_blake3.h"
3+
#include "blake3.h"
4+
5+
6+
#include <string.h> // memcpy
7+
8+
PHP_HASH_API void PHP_BLAKE3Init(PHP_BLAKE3_CTX *context)
9+
{
10+
blake3_hasher_init(context);
11+
}
12+
13+
PHP_HASH_API void PHP_BLAKE3Update(PHP_BLAKE3_CTX *context, const unsigned char *input, size_t len)
14+
{
15+
blake3_hasher_update(context, input, len);
16+
}
17+
18+
PHP_HASH_API void PHP_BLAKE3Final(unsigned char digest[BLAKE3_OUT_LEN/*32*/], PHP_BLAKE3_CTX *context)
19+
{
20+
blake3_hasher_finalize(context, digest, BLAKE3_OUT_LEN);
21+
}
22+
23+
PHP_HASH_API int PHP_BLAKE3Copy(const php_hash_ops *ops, PHP_BLAKE3_CTX *orig_context, PHP_BLAKE3_CTX *copy_context)
24+
{
25+
memcpy(copy_context, orig_context, sizeof(*orig_context));
26+
return SUCCESS;
27+
}

ext/hash/php_hash.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ extern const php_hash_ops php_hash_fnv1a32_ops;
105105
extern const php_hash_ops php_hash_fnv164_ops;
106106
extern const php_hash_ops php_hash_fnv1a64_ops;
107107
extern const php_hash_ops php_hash_joaat_ops;
108+
extern const php_hash_ops php_hash_blake3_ops;
108109

109110
#define PHP_HASH_HAVAL_OPS(p,b) extern const php_hash_ops php_hash_##p##haval##b##_ops;
110111

ext/hash/php_hash_blake3.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#ifndef PHP_HASH_BLAKE3_H
2+
#define PHP_HASH_BLAKE3_H
3+
4+
#include "ext/standard/basic_functions.h"
5+
#include "php_hash.h"
6+
#include "blake3.h"
7+
8+
9+
// typedef struct blake3_hasher PHP_BLAKE3_CTX;
10+
#define PHP_BLAKE3_CTX blake3_hasher
11+
// help: is V correct?
12+
#define PHP_BLAKE3_SPEC "b8b8qb64bbbbb1760"
13+
14+
PHP_HASH_API void PHP_BLAKE3Init(PHP_BLAKE3_CTX *context);
15+
PHP_HASH_API void PHP_BLAKE3Update(PHP_BLAKE3_CTX *context, const unsigned char *input, size_t len);
16+
PHP_HASH_API void PHP_BLAKE3Final(unsigned char digest[BLAKE3_OUT_LEN/*32*/], PHP_BLAKE3_CTX *context);
17+
PHP_HASH_API int PHP_BLAKE3Copy(const php_hash_ops *ops, PHP_BLAKE3_CTX *orig_context, PHP_BLAKE3_CTX *copy_context);
18+
19+
const php_hash_ops php_hash_blake3_ops = {
20+
"blake3",
21+
(php_hash_init_func_t) PHP_BLAKE3Init,
22+
(php_hash_update_func_t) PHP_BLAKE3Update,
23+
(php_hash_final_func_t) PHP_BLAKE3Final,
24+
(php_hash_copy_func_t) PHP_BLAKE3Copy,
25+
php_hash_serialize,
26+
php_hash_unserialize,
27+
PHP_BLAKE3_SPEC, // << don't know what this should be, hopefully a dev that knows can remove this comment
28+
BLAKE3_OUT_LEN /*32*/,
29+
BLAKE3_CHUNK_LEN /*1024*/,
30+
sizeof(PHP_BLAKE3_CTX),
31+
1
32+
};
33+
34+
#endif
35+

ext/hash/tests/hash-clone.phpt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ string(16) "bebc746a33b6ab62"
143143
string(5) "joaat"
144144
string(8) "aaebf370"
145145
string(8) "aaebf370"
146+
string(6) "blake3"
147+
string(64) "e232493e3d416e24ffc588b24a1772ccc6f80290f1920cf15f21313bc3543a51"
148+
string(64) "e232493e3d416e24ffc588b24a1772ccc6f80290f1920cf15f21313bc3543a51"
146149
string(10) "haval128,3"
147150
string(32) "86362472c8895e68e223ef8b3711d8d9"
148151
string(32) "86362472c8895e68e223ef8b3711d8d9"
@@ -302,6 +305,9 @@ string(16) "893899e4415a920f"
302305
string(5) "joaat"
303306
string(8) "aaebf370"
304307
string(8) "836fb0e5"
308+
string(6) "blake3"
309+
string(64) "e232493e3d416e24ffc588b24a1772ccc6f80290f1920cf15f21313bc3543a51"
310+
string(64) "dbdea45e5a6c3bad18a4f96d9d4b9105e4cceaa4fc06568f69829435c47587fb"
305311
string(10) "haval128,3"
306312
string(32) "86362472c8895e68e223ef8b3711d8d9"
307313
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"

ext/hash/tests/hash_algos.phpt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ var_dump(hash_algos());
99
?>
1010
--EXPECTF--
1111
*** Testing hash_algos() : basic functionality ***
12-
array(53) {
12+
array(54) {
1313
[%d]=>
1414
string(3) "md2"
1515
[%d]=>
@@ -87,6 +87,8 @@ array(53) {
8787
[%d]=>
8888
string(5) "joaat"
8989
[%d]=>
90+
string(6) "blake3"
91+
[%d]=>
9092
string(10) "haval128,3"
9193
[%d]=>
9294
string(10) "haval160,3"

ext/hash/tests/hash_copy_001.phpt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ string(16) "bebc746a33b6ab62"
143143
string(5) "joaat"
144144
string(8) "aaebf370"
145145
string(8) "aaebf370"
146+
string(6) "blake3"
147+
string(64) "e232493e3d416e24ffc588b24a1772ccc6f80290f1920cf15f21313bc3543a51"
148+
string(64) "e232493e3d416e24ffc588b24a1772ccc6f80290f1920cf15f21313bc3543a51"
146149
string(10) "haval128,3"
147150
string(32) "86362472c8895e68e223ef8b3711d8d9"
148151
string(32) "86362472c8895e68e223ef8b3711d8d9"
@@ -302,6 +305,9 @@ string(16) "893899e4415a920f"
302305
string(5) "joaat"
303306
string(8) "aaebf370"
304307
string(8) "836fb0e5"
308+
string(6) "blake3"
309+
string(64) "e232493e3d416e24ffc588b24a1772ccc6f80290f1920cf15f21313bc3543a51"
310+
string(64) "dbdea45e5a6c3bad18a4f96d9d4b9105e4cceaa4fc06568f69829435c47587fb"
305311
string(10) "haval128,3"
306312
string(32) "86362472c8895e68e223ef8b3711d8d9"
307313
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"

0 commit comments

Comments
 (0)