Location>code7788 >text

BLAKE3 (a more efficient verification method than MD5)

Popularity:674 ℃/2025-04-18 11:24:34

Virtual machine compilation

#include ""
#include <>
#include <>
#include <>
#include <>

int main(void) {
  // Initialize the hasher.
  blake3_hasher hasher;
  blake3_hasher_init(&hasher);

  // Read input bytes from stdin.
  unsigned char buf[65536];
  while (1) {
    ssize_t n = read(STDIN_FILENO, buf, sizeof(buf));
    if (n > 0) {
      blake3_hasher_update(&hasher, buf, n);
    } else if (n == 0) {
      break; // end of file
    } else {
      fprintf(stderr, "read failed: %s\n", strerror(errno));
      return 1;
    }
  }

  // Finalize the hash. BLAKE3_OUT_LEN is the default output length, 32 bytes.
  uint8_t output[BLAKE3_OUT_LEN];
  blake3_hasher_finalize(&hasher, output, BLAKE3_OUT_LEN);

  // Print the hash as hexadecimal.
  for (size_t i = 0; i < BLAKE3_OUT_LEN; i++) {
    printf("%02x", output[i]);
  }
  printf("\n");
  return 0;
}
gcc -O3 -o example   blake3_dispatch.c blake3_portable.c \
    blake3_sse2_x86-64_unix.S blake3_sse41_x86-64_unix.S blake3_avx2_x86-64_unix.S \
    blake3_avx512_x86-64_unix.S

Virtual machine running computing

wzh@wzh:~/work/BLAKE3/c$ ls -l
total 1332
-rw-rw-r-- 1 wzh wzh  12452  3moon 21 16:59 blake3_avx2.c
-rw-rw-r-- 1 wzh wzh  66050  3moon 21 16:59 blake3_avx2_x86-64_unix.S
-rw-rw-r-- 1 wzh wzh  66735  3moon 21 16:59 blake3_avx2_x86-64_windows_gnu.S
-rw-rw-r-- 1 wzh wzh  65948  3moon 21 16:59 blake3_avx2_x86-64_windows_msvc.asm
-rw-rw-r-- 1 wzh wzh  54592  3moon 21 16:59 blake3_avx512.c
-rw-rw-r-- 1 wzh wzh 161672  3moon 21 16:59 blake3_avx512_x86-64_unix.S
-rw-rw-r-- 1 wzh wzh  91003  3moon 21 16:59 blake3_avx512_x86-64_windows_gnu.S
-rw-rw-r-- 1 wzh wzh  91605  3moon 21 16:59 blake3_avx512_x86-64_windows_msvc.asm
-rw-rw-r-- 1 wzh wzh  28903  3moon 21 16:59 
-rw-rw-r-- 1 wzh wzh    108  3moon 21 16:59 
drwxrwxr-x 4 wzh wzh   4096  3moon 21 16:59 blake3_c_rust_bindings
-rw-rw-r-- 1 wzh wzh   9165  3moon 21 16:59 blake3_dispatch.c
-rw-rw-r-- 1 wzh wzh   2901  3moon 21 16:59 
-rw-rw-r-- 1 wzh wzh  12030  3moon 21 16:59 blake3_impl.h
-rw-rw-r-- 1 wzh wzh  13833  3moon 21 16:59 blake3_neon.c
-rw-rw-r-- 1 wzh wzh   5889  3moon 21 16:59 blake3_portable.c
-rw-rw-r-- 1 wzh wzh  21005  3moon 21 16:59 blake3_sse2.c
-rw-rw-r-- 1 wzh wzh  68858  3moon 21 16:59 blake3_sse2_x86-64_unix.S
-rw-rw-r-- 1 wzh wzh  71202  3moon 21 16:59 blake3_sse2_x86-64_windows_gnu.S
-rw-rw-r-- 1 wzh wzh  70982  3moon 21 16:59 blake3_sse2_x86-64_windows_msvc.asm
-rw-rw-r-- 1 wzh wzh  20813  3moon 21 16:59 blake3_sse41.c
-rw-rw-r-- 1 wzh wzh  61143  3moon 21 16:59 blake3_sse41_x86-64_unix.S
-rw-rw-r-- 1 wzh wzh  63459  3moon 21 16:59 blake3_sse41_x86-64_windows_gnu.S
-rw-rw-r-- 1 wzh wzh  63194  3moon 21 16:59 blake3_sse41_x86-64_windows_msvc.asm
-rw-rw-r-- 1 wzh wzh   1301  3moon 21 16:59 blake3_tbb.cpp
drwxrwxr-x 3 wzh wzh   4096  3moon 21 16:59 cmake
-rw-rw-r-- 1 wzh wzh  13364  3moon 21 16:59 
-rw-rw-r-- 1 wzh wzh   1848  3moon 21 16:59 
drwxrwxr-x 3 wzh wzh   4096  3moon 21 16:59 dependencies
-rwxrwxr-x 1 wzh wzh 101888  3moon 21 16:59 example
-rw-rw-r-- 1 wzh wzh    868  3moon 21 16:59 
-rw-rw-r-- 1 wzh wzh   1625  3moon 21 16:59 example_tbb.c
-rw-rw-r-- 1 wzh wzh    314  3moon 21 16:59 
-rw-rw-r-- 1 wzh wzh   4043  3moon 21 16:59 
-rw-rw-r-- 1 wzh wzh   2057  3moon 21 16:59 
-rw-rw-r-- 1 wzh wzh  13644  3moon 21 16:59 
-rwxrwxr-x 1 wzh wzh   3654  3moon 21 16:59 
wzh@wzh:~/work/BLAKE3/c$ echo "Hello, World!" | ./example 
6233834bce7817db1e401bceea2b8b45c1600115d25b51906c05ee32156b51c2
wzh@wzh:~/work/BLAKE3/c$ echo "Hello, World!" | ./example 
6233834bce7817db1e401bceea2b8b45c1600115d25b51906c05ee32156b51c2
wzh@wzh:~/work/BLAKE3/c$ 

3. Cross-compilation

mips-linux-uclibc-gnu-gcc -O3 -o example   blake3_dispatch.c blake3_portable.c -std=c99

4. Run after cross-compile

[root@mvt:kangshifu]# echo "Hello, World!" | ./example
6233834bce7817db1e401bceea2b8b45c1600115d25b51906c05ee32156b51c2

5. Conclusion

1. The space occupied by the compilation of C language in the virtual machine is very small, and assembly instruction set optimization is used. The example occupies 101888 bytes, which can complete the calculation of BLAKE3.
2. The space occupied by the C language in embedded form is smaller after compilation, and the example occupies 35137 bytes, which can complete the calculation of BLAKE3.