diff options
| author | bryan newbold <bnewbold@robocracy.org> | 2023-03-09 12:26:22 -0800 | 
|---|---|---|
| committer | bryan newbold <bnewbold@robocracy.org> | 2023-03-09 12:26:22 -0800 | 
| commit | 1c5ce5dd9b9c0883fa660c415c7336d6e1382e32 (patch) | |
| tree | 1461d7e7cbbb9b4f28c258e7794a8b0328aad033 | |
| parent | 965b7b35f931865a1b21a681b6f6665703857c61 (diff) | |
| download | adenosine-1c5ce5dd9b9c0883fa660c415c7336d6e1382e32.tar.gz adenosine-1c5ce5dd9b9c0883fa660c415c7336d6e1382e32.zip | |
mst: switch to fanout=4
| -rw-r--r-- | adenosine/src/mst.rs | 42 | 
1 files changed, 31 insertions, 11 deletions
| diff --git a/adenosine/src/mst.rs b/adenosine/src/mst.rs index c695ac6..7c9d4ee 100644 --- a/adenosine/src/mst.rs +++ b/adenosine/src/mst.rs @@ -175,12 +175,16 @@ pub fn collect_mst_keys(      Ok(())  } +// "fanout=4", meaning counting 2 bits at a time  fn leading_zeros(key: &[u8]) -> u8 {      let digest = sha256::digest(key);      let digest = digest.as_bytes();      for (i, c) in digest.iter().enumerate() { +        if *c >= b'4' { +            return (i * 2) as u8; +        }          if *c != b'0' { -            return i as u8; +            return (i * 2 + 1) as u8;          }      }      digest.len() as u8 @@ -199,12 +203,13 @@ fn leading_zeros(key: &[u8]) -> u8 {  fn test_leading_zeros() {      assert_eq!(leading_zeros(b""), 0);      assert_eq!(leading_zeros(b"asdf"), 0); +    assert_eq!(leading_zeros(b"blue"), 1);      assert_eq!(leading_zeros(b"2653ae71"), 0); -    assert_eq!(leading_zeros(b"88bfafc7"), 1); -    assert_eq!(leading_zeros(b"2a92d355"), 2); -    assert_eq!(leading_zeros(b"884976f5"), 3); -    assert_eq!(leading_zeros(b"app.bsky.feed.post/454397e440ec"), 2); -    assert_eq!(leading_zeros(b"app.bsky.feed.post/9adeb165882c"), 4); +    assert_eq!(leading_zeros(b"88bfafc7"), 2); +    assert_eq!(leading_zeros(b"2a92d355"), 4); +    assert_eq!(leading_zeros(b"884976f5"), 6); +    assert_eq!(leading_zeros(b"app.bsky.feed.post/454397e440ec"), 4); +    assert_eq!(leading_zeros(b"app.bsky.feed.post/9adeb165882c"), 8);  }  pub fn generate_mst( @@ -332,12 +337,27 @@ fn test_common_prefix_len_wide() {      assert_eq!("👩👧👧".as_bytes().len(), 18); // 8 in javascript      // many of the below are different in JS; in Rust we *must* cast down to bytes to count -    assert_eq!(common_prefix_len("jalapeño".as_bytes(), "jalapeno".as_bytes()), 6); -    assert_eq!(common_prefix_len("jalapeñoA".as_bytes(), "jalapeñoB".as_bytes()), 9); -    assert_eq!(common_prefix_len("coöperative".as_bytes(), "coüperative".as_bytes()), 3); -    assert_eq!(common_prefix_len("abc💩abc".as_bytes(), "abcabc".as_bytes()), 3); +    assert_eq!( +        common_prefix_len("jalapeño".as_bytes(), "jalapeno".as_bytes()), +        6 +    ); +    assert_eq!( +        common_prefix_len("jalapeñoA".as_bytes(), "jalapeñoB".as_bytes()), +        9 +    ); +    assert_eq!( +        common_prefix_len("coöperative".as_bytes(), "coüperative".as_bytes()), +        3 +    ); +    assert_eq!( +        common_prefix_len("abc💩abc".as_bytes(), "abcabc".as_bytes()), +        3 +    );      assert_eq!(common_prefix_len("💩abc".as_bytes(), "💩ab".as_bytes()), 6); -    assert_eq!(common_prefix_len("abc👩👦👦de".as_bytes(), "abc👩👧👧de".as_bytes()), 13); +    assert_eq!( +        common_prefix_len("abc👩👦👦de".as_bytes(), "abc👩👧👧de".as_bytes()), +        13 +    );  }  fn serialize_wip_tree( | 
