fixed! 321000/s

This commit is contained in:
shenjack 2024-02-29 19:49:49 +08:00
parent dc24a5c900
commit d784a7026a
Signed by: shenjack
GPG Key ID: 7B1134A979775551
2 changed files with 167 additions and 112 deletions

View File

@ -59,11 +59,10 @@ fn cacl(start: u64, max: u64, step: usize, top: u32, id: u64, team: &String) {
let mut start_time = std::time::Instant::now();
let mut k: u64 = 0;
let mut top = top;
let team_namer = name::TeamNamer::new_unchecked(team.as_str());
for i in (start+id..max).step_by(step) {
let name = gen_name(i as u64);
// let full_name = format!("{}@shenjack", name);
// let namer = name::Namer::new(&full_name);
let namer = name::Namer::new_raw(name.as_str(), team);
let namer = name::Namer::new_from_team_namer_unchecked(&team_namer, name.as_str());
let prop = namer.get_property();
if (prop + allow_d as f32) > top as f32 {
if prop > top as f32 {

View File

@ -5,65 +5,131 @@ pub fn median<T>(x: T, y: T, z: T) -> T
where
T: std::cmp::Ord + std::marker::Copy,
{
// std::max(std::min(x, y), std::min(std::max(x, y), z))
x.max(y).max(x.min(y).min(z))
}
#[derive(Debug, Clone)]
pub struct TeamNamer {
pub team: String,
pub val: [u8; 256],
}
impl TeamNamer {
/// 方便使用的 new
/// 会检查长度是否超过 256
#[inline(always)]
pub fn new(team: &str) -> Option<Self> {
if team.len() > 256 {
warn!("Team too long({}): {}", team.len(), team);
return None;
}
Some(Self::new_unchecked(team))
}
#[inline(always)]
pub fn new_unchecked(team: &str) -> Self {
let team_bytes = team.as_bytes();
let mut val: [u8; 256] = (0..=255).collect::<Vec<u8>>().try_into().unwrap();
let mut s = 0_u8;
let t_len = team.len() + 1;
for i in 0..256 {
if (i % t_len) != 0 {
s = s.wrapping_add(team_bytes[(i % t_len) - 1]);
}
s = s.wrapping_add(val[i]);
val.swap(i, s as usize);
}
Self {
team: team.to_string(),
val,
}
}
#[inline(always)]
pub fn clone_vals(&self) -> [u8; 256] {
self.val.clone()
}
}
#[derive(Debug, Clone)]
pub struct Namer {
pub name: String,
pub team: String,
pub val: [u8; 256],
pub name_base: [u8; 128],
pub name_bytes: [u8; 256],
pub team_bytes: [u8; 256],
pub name_prop: [u32; 8],
pub skl_id: [u8; 40],
pub skl_freq: [u8; 40],
}
impl Namer {
// pub fn new(raw_name: &String) -> Option<Self> {
// // name@team
// // name
// let (name, team) = raw_name.split_once('@').unwrap_or((raw_name, ""));
// // len < 256
// if name.len() > 256 {
// warn!("Name too long({}): {}", name.len(), name);
// return None;
// }
// if team.len() > 256 {
// warn!("Team too long({}): {}", team.len(), team);
// return None;
// }
// Some(Self::new_raw(name.to_string(), &team.to_string()))
// }
/// 最完整的、最简单的 new
/// 可以直接丢一个 name 进来
#[inline(always)]
pub fn new_raw(name: &str, team: &str) -> Self {
let mut val = [0_u8; 256];
for i in 0..256 {
val[i] = i as u8;
pub fn new(full_name: &String) -> Option<Self> {
// name@team
// name
let (name, team) = full_name.split_once('@').unwrap_or((full_name, ""));
if name.len() > 256 {
warn!("Name too long({}): {}", name.len(), name);
return None;
}
if team.len() > 256 {
warn!("Team too long({}): {}", team.len(), team);
return None;
}
Some(Self::new_raw_unchecked(name, team))
}
/// 用起来也很方便的
/// 只不过是需要分别输入, 也挺好用的
/// 包括了长度检测
#[inline(always)]
pub fn new_raw(name: &str, team: &str) -> Option<Self> {
if name.len() > 256 {
warn!("Name too long({}): {}", name.len(), name);
return None;
}
if team.len() > 256 {
warn!("Team too long({}): {}", team.len(), team);
return None;
}
Some(Self::new_raw_unchecked(name, team))
}
/// 不带检查长度的 new
/// 依然可以传一个完整的进来
#[inline(always)]
pub fn new_unchecked(full_name: &str) -> Self {
let (name, team) = full_name.split_once('@').unwrap_or((full_name, ""));
Self::new_raw_unchecked(name, team)
}
/// 大部分情况下的实际调用 p1
/// p2 是 new_from_team_namer_unchecked
/// 实际上还是个包装
#[inline(always)]
pub fn new_raw_unchecked(name: &str, team: &str) -> Self {
let team_namer = TeamNamer::new_unchecked(team);
Self::new_from_team_namer_unchecked(&team_namer, name)
}
/// 带检查长度的 from namer
/// 我其实也不知道为啥要有他, 就带上了吧
#[inline(always)]
pub fn new_from_team_namer(team_namer: &TeamNamer, name: &str) -> Option<Self> {
if name.len() > 256 {
warn!("Name too long({}): {}", name.len(), name);
return None;
}
Some(Self::new_from_team_namer_unchecked(team_namer, name))
}
/// 实际 new 实现
#[inline(always)]
pub fn new_from_team_namer_unchecked(team_namer: &TeamNamer, name: &str) -> Self {
let mut val: [u8; 256] = team_namer.clone_vals();
// let mut val: [u8; 256] = (0..=255).collect::<Vec<u8>>().try_into().unwrap();
let mut name_base = [0_u8; 128];
let mut name_prop = [0_u32; 8];
let skl_id = [0_u8; 40];
let skl_freq = [0_u8; 40];
// len < 256
// if name.len() > 256 {
// warn!("Name too long({}): {}", name.len(), name);
// return None;
// }
let name_len = name.len();
// if team.len() > 256 {
// warn!("Team too long({}): {}", team.len(), team);
// return None;
// }
let team_len = team.len();
let name_bytes = name.as_bytes();
let team_bytes = team.as_bytes();
let name_len = name_bytes.len();
// 转到 256 长度 的 u8 数组
let name_bytes = {
let mut bytes = [0_u8; 256];
@ -72,38 +138,26 @@ impl Namer {
}
bytes
};
let team_bytes = {
let mut bytes = [0_u8; 256];
for i in 0..team_len {
bytes[i + 1] = team_bytes[i];
}
bytes
};
// 计算
// // 计算
// for i in 0..256 {
// s += team_bytes[i % (team_len + 1)] as u32 + val[i] as u32;
// s %= 256;
// let tmp = val[i];
// val[i] = val[s as usize];
// val[s as usize] = tmp;
// }
// s = 0;
let mut s = 0_u32;
for i in 0..256 {
s += team_bytes[i % (team_len + 1)] as u32 + val[i] as u32;
s %= 256;
let tmp = val[i];
val[i] = val[s as usize];
val[s as usize] = tmp;
}
s = 0;
for j in 0..256 {
s += name_bytes[j % (name_len + 1)] as u32 + val[j] as u32;
s %= 256;
let tmp = val[j];
val[j] = val[s as usize];
val[s as usize] = tmp;
}
s = 0;
for j in 0..256 {
s += name_bytes[j % (name_len + 1)] as u32 + val[j] as u32;
s %= 256;
let tmp = val[j];
val[j] = val[s as usize];
val[s as usize] = tmp;
for _ in 0..2 {
for j in 0..256 {
s += name_bytes[j % (name_len + 1)] as u32 + val[j] as u32;
s %= 256;
let tmp = val[j];
val[j] = val[s as usize];
val[s as usize] = tmp;
}
s = 0;
}
s = 0;
for i in 0..256 {
@ -135,11 +189,9 @@ impl Namer {
Self {
name: name.to_string(),
team: team.to_string(),
team: team_namer.team.clone(),
val,
name_base,
name_bytes,
team_bytes,
name_prop,
skl_id,
skl_freq,
@ -155,47 +207,51 @@ impl Namer {
}
}
// #[cfg(test)]
// mod test {
// use super::*;
#[cfg(test)]
mod test {
use super::*;
// #[test]
// fn basic_new_test() {
// let namer = Namer::new(&"x@x".to_string());
#[test]
fn basic_new_test() {
let team = TeamNamer::new_unchecked("x");
let namer = Namer::new_from_team_namer_unchecked(&team, "x");
// let namer = Namer::new(&"x@x".to_string());
// assert!(namer.is_some());
// assert!(namer.is_some());
// let namer = namer.unwrap();
// let namer = namer.unwrap();
println!("team val: {:?}", team.val);
println!("namer: {:?}", crate::show_name(&namer));
// let base_name_vec: Vec<u8> = vec![
// 53, 0, 40, 4, 58, 61, 37, 46, 56, 51, 21, 20, 27, 17, 15, 26, 13, 30, 52, 63, 36, 30,
// 57, 34, 22, 37, 35, 6, 12, 25, 50, 49, 59, 23, 49, 27, 51, 58, 39, 28, 60, 20, 31, 36,
// 41, 11, 7, 29, 24, 24, 61, 62, 57, 4, 28, 48, 55, 50, 38, 29, 10, 40, 42, 15, 23, 47,
// 42, 62, 47, 1, 60, 5, 43, 21, 1, 46, 45, 9, 9, 14, 38, 13, 56, 0, 31, 59, 39, 6, 35,
// 41, 55, 5, 34, 3, 7, 33, 33, 45, 16, 16, 32, 43, 18, 44, 22, 14, 17, 10, 11, 53, 18,
// 44, 19, 52, 2, 32, 12, 8, 2, 54, 26, 48, 8, 3, 63, 54, 19, 25,
// ];
// let val_vec: Vec<u8> = vec![
// 225, 96, 49, 232, 20, 47, 115, 245, 234, 23, 111, 178, 231, 100, 118, 197, 42, 98, 137,
// 196, 209, 86, 114, 184, 167, 129, 164, 239, 205, 211, 82, 173, 189, 153, 198, 67, 4, 3,
// 90, 52, 128, 134, 176, 145, 85, 9, 250, 30, 63, 247, 240, 17, 215, 200, 78, 188, 132,
// 117, 10, 45, 162, 79, 123, 73, 109, 91, 57, 210, 22, 175, 107, 203, 103, 32, 83, 70,
// 242, 75, 220, 140, 148, 15, 138, 44, 228, 43, 105, 199, 99, 116, 97, 69, 80, 172, 230,
// 25, 224, 33, 31, 135, 235, 74, 193, 238, 233, 88, 216, 204, 24, 163, 141, 6, 201, 26,
// 38, 21, 186, 237, 101, 206, 212, 76, 144, 219, 149, 169, 202, 110, 41, 166, 139, 194,
// 168, 34, 142, 147, 187, 108, 223, 94, 5, 243, 226, 60, 40, 102, 51, 87, 61, 236, 46,
// 159, 64, 227, 113, 190, 81, 127, 65, 8, 183, 253, 150, 249, 229, 37, 156, 182, 180,
// 246, 124, 244, 174, 122, 89, 120, 160, 35, 143, 11, 14, 151, 133, 27, 177, 251, 221,
// 207, 58, 29, 131, 119, 171, 157, 93, 185, 48, 112, 192, 191, 66, 106, 39, 59, 92, 19,
// 1, 155, 254, 84, 222, 165, 54, 121, 13, 50, 36, 130, 95, 161, 213, 170, 28, 241, 71,
// 53, 68, 218, 0, 252, 16, 136, 179, 158, 248, 2, 154, 12, 125, 126, 255, 18, 146, 104,
// 77, 152, 208, 214, 72, 55, 195, 62, 7, 217, 56, 181,
// ];
// let prop_vec: Vec<u32> = vec![57, 53, 66, 72, 70, 71, 61, 344];
// assert_eq!(namer.name, "x");
// assert_eq!(namer.team, "x");
// assert_eq!(namer.val.to_vec(), val_vec);
// assert_eq!(namer.name_prop.to_vec(), prop_vec);
// assert_eq!(namer.name_base.to_vec(), base_name_vec);
// }
// }
let base_name_vec: Vec<u8> = vec![
53, 0, 40, 4, 58, 61, 37, 46, 56, 51, 21, 20, 27, 17, 15, 26, 13, 30, 52, 63, 36, 30,
57, 34, 22, 37, 35, 6, 12, 25, 50, 49, 59, 23, 49, 27, 51, 58, 39, 28, 60, 20, 31, 36,
41, 11, 7, 29, 24, 24, 61, 62, 57, 4, 28, 48, 55, 50, 38, 29, 10, 40, 42, 15, 23, 47,
42, 62, 47, 1, 60, 5, 43, 21, 1, 46, 45, 9, 9, 14, 38, 13, 56, 0, 31, 59, 39, 6, 35,
41, 55, 5, 34, 3, 7, 33, 33, 45, 16, 16, 32, 43, 18, 44, 22, 14, 17, 10, 11, 53, 18,
44, 19, 52, 2, 32, 12, 8, 2, 54, 26, 48, 8, 3, 63, 54, 19, 25,
];
let val_vec: Vec<u8> = vec![
225, 96, 49, 232, 20, 47, 115, 245, 234, 23, 111, 178, 231, 100, 118, 197, 42, 98, 137,
196, 209, 86, 114, 184, 167, 129, 164, 239, 205, 211, 82, 173, 189, 153, 198, 67, 4, 3,
90, 52, 128, 134, 176, 145, 85, 9, 250, 30, 63, 247, 240, 17, 215, 200, 78, 188, 132,
117, 10, 45, 162, 79, 123, 73, 109, 91, 57, 210, 22, 175, 107, 203, 103, 32, 83, 70,
242, 75, 220, 140, 148, 15, 138, 44, 228, 43, 105, 199, 99, 116, 97, 69, 80, 172, 230,
25, 224, 33, 31, 135, 235, 74, 193, 238, 233, 88, 216, 204, 24, 163, 141, 6, 201, 26,
38, 21, 186, 237, 101, 206, 212, 76, 144, 219, 149, 169, 202, 110, 41, 166, 139, 194,
168, 34, 142, 147, 187, 108, 223, 94, 5, 243, 226, 60, 40, 102, 51, 87, 61, 236, 46,
159, 64, 227, 113, 190, 81, 127, 65, 8, 183, 253, 150, 249, 229, 37, 156, 182, 180,
246, 124, 244, 174, 122, 89, 120, 160, 35, 143, 11, 14, 151, 133, 27, 177, 251, 221,
207, 58, 29, 131, 119, 171, 157, 93, 185, 48, 112, 192, 191, 66, 106, 39, 59, 92, 19,
1, 155, 254, 84, 222, 165, 54, 121, 13, 50, 36, 130, 95, 161, 213, 170, 28, 241, 71,
53, 68, 218, 0, 252, 16, 136, 179, 158, 248, 2, 154, 12, 125, 126, 255, 18, 146, 104,
77, 152, 208, 214, 72, 55, 195, 62, 7, 217, 56, 181,
];
let prop_vec: Vec<u32> = vec![57, 53, 66, 72, 70, 71, 61, 344];
assert_eq!(namer.name, "x");
assert_eq!(namer.team, "x");
assert_eq!(namer.val.to_vec(), val_vec);
assert_eq!(namer.name_prop.to_vec(), prop_vec);
assert_eq!(namer.name_base.to_vec(), base_name_vec);
}
}