Skip to content

Commit af1dd71

Browse files
committed
windows
1 parent 36a01be commit af1dd71

File tree

5 files changed

+211
-91
lines changed

5 files changed

+211
-91
lines changed

Cargo.lock

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

lib/bencher_fingerprint/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ authors.workspace = true
66
edition.workspace = true
77
license-file.workspace = true
88

9-
[dependencies]
9+
[target.'cfg(windows)'.dependencies]
10+
uuid.workspace = true
11+
windows = { version = "0.60", features = ["System_Profile"] }
1012

1113
[lints]
1214
workspace = true

lib/bencher_fingerprint/src/lib.rs

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

4-
// #[cfg(target_os = "linux")]
5-
// pub use linus::Fingerprint;
84+
let fingerprint = Fingerprint(0);
85+
let display = format!("{fingerprint:#}");
86+
assert_eq!(display, "0");
87+
}
88+
}
Lines changed: 2 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,12 @@
1-
use std::iter::successors;
2-
use std::{fmt, fs};
1+
use std::fs;
32

43
const HEX_BASE: u32 = 16;
5-
const BASE: u128 = 36;
6-
const BUF_SIZE: usize = 25;
74

8-
pub struct Fingerprint(u128);
9-
10-
impl Fingerprint {
5+
impl crate::Fingerprint {
116
pub fn new() -> Option<Self> {
127
fs::read_to_string("/etc/machine-id")
138
.ok()
149
.and_then(|id| u128::from_str_radix(&id, HEX_BASE).ok())
1510
.map(Self)
1611
}
1712
}
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-
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use uuid::Uuid;
2+
3+
impl crate::Fingerprint {
4+
pub fn new() -> Option<Self> {
5+
windows::System::Profile::SystemManufacturers::SmbiosInformation::SerialNumber()
6+
.ok()
7+
.as_ref()
8+
.and_then(|uuid| Uuid::parse_str(uuid).ok())
9+
.map(|uuid| uuid.as_u128())
10+
.map(Self)
11+
}
12+
}

0 commit comments

Comments
 (0)