pub fn hash_code(name: &str) -> u32 {
let mut hash: i32 = 0;
for ch in name.chars() {
let character = ch as i32;
hash = ((hash << 5).wrapping_sub(hash)).wrapping_add(character);
hash = hash & hash; }
hash.abs() as u32
}
pub fn get_modulus(num: u32, max: u32) -> u32 {
num % max
}
pub fn get_digit(number: u32, ntn: u32) -> u32 {
((number / 10_u32.pow(ntn)) % 10)
}
pub fn get_boolean(number: u32, ntn: u32) -> bool {
(get_digit(number, ntn) % 2) == 0
}
pub fn get_angle(x: f64, y: f64) -> f64 {
y.atan2(x) * 180.0 / std::f64::consts::PI
}
pub fn get_unit(number: u32, range: i32, index: Option<u32>) -> i32 {
let value = (number as i32) % range;
if let Some(idx) = index {
if (get_digit(number, idx) % 2) == 0 {
return -value;
}
}
value
}
pub fn get_random_color(number: u32, colors: &[String], range: usize) -> String {
colors[(number as usize) % range].clone()
}
pub fn get_contrast(hexcolor: &str) -> String {
let hex = hexcolor.trim_start_matches('#');
let r = u32::from_str_radix(&hex[0..2], 16).unwrap_or(0);
let g = u32::from_str_radix(&hex[2..4], 16).unwrap_or(0);
let b = u32::from_str_radix(&hex[4..6], 16).unwrap_or(0);
let yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;
if yiq >= 128 {
"#000000".to_string()
} else {
"#FFFFFF".to_string()
}
}