mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-20 11:19:36 +00:00
115 lines
2.7 KiB
Markdown
115 lines
2.7 KiB
Markdown
# faster-hex
|
|
|
|
[![License]](#license)
|
|
[![crate-badge]](https://crates.io/crates/faster-hex)
|
|
|
|
[crate-badge]: https://img.shields.io/crates/v/faster-hex.svg
|
|
[license]: https://img.shields.io/badge/License-MIT-green.svg
|
|
|
|
This program implements hex encoding a slice into a predetermined
|
|
destination using various different instruction sets.
|
|
|
|
## Benchmark
|
|
|
|
### Running
|
|
Runs benchmark
|
|
```
|
|
cargo bench
|
|
```
|
|
|
|
### Results
|
|
Machine: MacBook Pro (Early 2015) (2.7 GHz Intel Core i5)
|
|
|
|
Rust: rustc 1.31.0 (abe02cefd 2018-12-04)
|
|
|
|
Compare with [hex](https://crates.io/crates/hex):
|
|
|
|
* Encoding ~10x over
|
|
* Decoding ~10x over
|
|
|
|
Compare with [rustc-hex](https://crates.io/crates/rustc-hex):
|
|
|
|
* Encoding ~2.5x over
|
|
* Decoding ~7x over
|
|
|
|
## Examples
|
|
Encode to hex
|
|
|
|
```rust
|
|
use faster_hex::hex_string;
|
|
|
|
let result = hex_string(b"Hello world!");
|
|
assert_eq!(result, "48656c6c6f20776f726c6421");
|
|
```
|
|
Encode to upper case hex
|
|
```rust
|
|
use faster_hex::hex_string_upper;
|
|
|
|
let result = hex_string_upper(b"Hello world!");
|
|
assert_eq!(result, "48656C6C6F20776F726C6421");
|
|
```
|
|
|
|
Decode
|
|
```rust
|
|
use faster_hex::hex_decode;
|
|
|
|
let src = b"48656c6c6f20776f726c6421";
|
|
let mut dst = vec![0; src.len() / 2];
|
|
hex_decode(src, &mut dst).unwrap();
|
|
assert_eq!(dst, b"Hello world!");
|
|
```
|
|
Decode with case check
|
|
```rust
|
|
use faster_hex::{hex_decode_with_case, CheckCase};
|
|
|
|
let src = b"48656c6c6f20776f726c6421";
|
|
let mut dst = vec![0; src.len() / 2];
|
|
|
|
assert!(hex_decode_with_case(src, &mut dst, CheckCase::Lower).is_ok());
|
|
assert_eq!(dst, b"Hello world!");
|
|
|
|
assert!(hex_decode_with_case(src, &mut dst, CheckCase::None).is_ok());
|
|
assert_eq!(dst, b"Hello world!");
|
|
|
|
assert!(hex_decode_with_case(src, &mut dst, CheckCase::Upper).is_err());
|
|
```
|
|
|
|
Serde feature
|
|
```rust
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
|
|
struct Simple {
|
|
#[serde(with = "faster_hex")]
|
|
foo: Vec<u8>,
|
|
#[serde(with = "faster_hex::nopfx_lowercase")]
|
|
bar: Vec<u8>,
|
|
}
|
|
```
|
|
|
|
|
|
## Notice
|
|
|
|
Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable.
|
|
|
|
MINOR version when make incompatible API changes before 1.0.0.
|
|
|
|
|
|
## License
|
|
|
|
This project is licensed under the [MIT license](LICENSE).
|
|
|
|
### Third party software
|
|
|
|
This product includes copies and modifications of software developed by third parties:
|
|
|
|
* [src/encode.rs](src/encode.rs) is based on
|
|
[stdsimd](https://github.com/rust-lang-nursery/stdsimd), licensed
|
|
under the MIT license or the Apache License (Version 2.0).
|
|
* [src/decode.rs](src/decode.rs) avx2 decode is modified from [fast-hex](https://github.com/zbjornson/fast-hex)
|
|
|
|
See the source code files for more details.
|
|
|
|
Copies of third party licenses can be found in [LICENSE-THIRD-PARTY](LICENSE-THIRD-PARTY).
|