Skip to content

Commit 36a01be

Browse files
committed
bencher_fingerprint
1 parent b0111b5 commit 36a01be

File tree

5 files changed

+116
-0
lines changed

5 files changed

+116
-0
lines changed

Cargo.lock

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ bencher_adapter = { path = "lib/bencher_adapter" }
2626
bencher_boundary = { path = "lib/bencher_boundary" }
2727
bencher_client = { path = "lib/bencher_client" }
2828
bencher_comment = { path = "lib/bencher_comment" }
29+
bencher_fingerprint = { path = "lib/bencher_fingerprint" }
2930
bencher_github = { path = "lib/bencher_github" }
3031
bencher_json = { path = "lib/bencher_json" }
3132
bencher_logger = { path = "lib/bencher_logger" }

lib/bencher_fingerprint/Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "bencher_fingerprint"
3+
homepage.workspace = true
4+
version.workspace = true
5+
authors.workspace = true
6+
edition.workspace = true
7+
license-file.workspace = true
8+
9+
[dependencies]
10+
11+
[lints]
12+
workspace = true

lib/bencher_fingerprint/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// #[cfg(target_os = "linux")]
2+
mod linux;
3+
4+
// #[cfg(target_os = "linux")]
5+
// pub use linus::Fingerprint;
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
use std::iter::successors;
2+
use std::{fmt, fs};
3+
4+
const HEX_BASE: u32 = 16;
5+
const BASE: u128 = 36;
6+
const BUF_SIZE: usize = 25;
7+
8+
pub struct Fingerprint(u128);
9+
10+
impl Fingerprint {
11+
pub fn new() -> Option<Self> {
12+
fs::read_to_string("/etc/machine-id")
13+
.ok()
14+
.and_then(|id| u128::from_str_radix(&id, HEX_BASE).ok())
15+
.map(Self)
16+
}
17+
}
18+
19+
impl fmt::Display for Fingerprint {
20+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
21+
let mut buffer = [0u8; BUF_SIZE];
22+
23+
let divided = successors(Some(self.0), |n| match n / BASE {
24+
0 => None,
25+
26+
n => Some(n),
27+
});
28+
29+
let written = buffer
30+
.iter_mut()
31+
.rev()
32+
.zip(divided)
33+
.map(|(c, n)| *c = digit((n % BASE) as u8, f.alternate()))
34+
.count();
35+
36+
let index = BUF_SIZE - written;
37+
let number = buffer.get(index..).unwrap_or_default();
38+
39+
// There are only ASCII chars inside the buffer,
40+
// so the string should always be a valid UTF-8 string.
41+
let number_str = std::str::from_utf8(number).unwrap_or_default();
42+
43+
f.write_str(number_str)
44+
}
45+
}
46+
47+
#[inline]
48+
fn digit(u: u8, alternate: bool) -> u8 {
49+
let a = if alternate { b'A' } else { b'a' };
50+
match u {
51+
0..=9 => u + b'0',
52+
10..=35 => u - 10 + a,
53+
_ => {
54+
debug_assert!(false, "Digit is greater than base {BASE}");
55+
b'0'
56+
},
57+
}
58+
}
59+
60+
#[allow(clippy::unreadable_literal)]
61+
#[cfg(test)]
62+
mod tests {
63+
use super::*;
64+
65+
#[test]
66+
fn test_fingerprint_display() {
67+
let fingerprint = Fingerprint(0x1234567890abcdef1234567890abcdef);
68+
let display = format!("{fingerprint}");
69+
assert_eq!(display, "12srde1xpfeunnr6aa7s0b4z3");
70+
71+
let fingerprint = Fingerprint(0xffffffffffffffffffffffffffffffff);
72+
let display = format!("{fingerprint}");
73+
assert_eq!(display, "f5lxx1zz5pnorynqglhzmsp33");
74+
75+
let fingerprint = Fingerprint(0);
76+
let display = format!("{fingerprint}");
77+
assert_eq!(display, "0");
78+
}
79+
80+
#[test]
81+
fn test_fingerprint_display_alternate() {
82+
let fingerprint = Fingerprint(0x1234567890abcdef1234567890abcdef);
83+
let display = format!("{fingerprint:#}");
84+
assert_eq!(display, "12SRDE1XPFEUNNR6AA7S0B4Z3");
85+
86+
let fingerprint = Fingerprint(0xffffffffffffffffffffffffffffffff);
87+
let display = format!("{fingerprint:#}");
88+
assert_eq!(display, "F5LXX1ZZ5PNORYNQGLHZMSP33");
89+
90+
let fingerprint = Fingerprint(0);
91+
let display = format!("{fingerprint:#}");
92+
assert_eq!(display, "0");
93+
}
94+
}

0 commit comments

Comments
 (0)