rust_rsm/alg/
mod.rs

1#![allow(non_camel_case_types)]
2#![allow(non_snake_case)]
3#![allow(non_upper_case_globals)]
4pub mod hash_alg;
5pub mod crypto;
6
7pub use crypto::crypto_alg_t;
8
9use std::mem;
10use crate::common::errcode;
11
12pub mod spf;
13pub use spf::spf_matrix_t;
14pub mod prio_queue;
15pub use prio_queue::priority_queue_t;
16
17const MAX_SIZE:usize = 65536;
18
19const SPF_MAX_NODE_NUM:usize = 1024;
20
21///将两个切片进行Xor处理,结果写入dst中;需要dst的长度大于src,src不足的长度按照0进行补足
22pub fn slice_xor(src:&[u8],dst:&mut [u8])->errcode::RESULT {
23    let src_len = src.len();
24    let dst_len = dst.len();
25
26    if dst_len<src_len {
27        return errcode::ERROR_BUFFER_TOO_SMALL;
28    }
29    let u64_src_len:usize = src_len/mem::size_of::<u64>();    
30
31    let u64_dst = unsafe { &mut *(dst.as_mut_ptr() as *mut [u64;MAX_SIZE]) };
32    let u64_src = unsafe { &*(src.as_ptr() as *const [u64;MAX_SIZE])};
33
34    for i in 0..u64_src_len {
35        u64_dst[i] ^=u64_src[i];
36    }
37    let u64_dst_len:usize = dst_len/mem::size_of::<u64>();
38    for j in u64_src_len..u64_dst_len {
39        u64_dst[j] ^=0u64;
40    }
41
42    for k in u64_dst_len*mem::size_of::<u64>()..dst_len {
43        dst[k] ^=0u8;
44    }
45    return errcode::RESULT_SUCCESS
46}
47
48///将两个切片进行Xor处理,结果写入dst中;需要dst的长度大于src,src不足的长度按照0进行补足
49pub fn slice_xor_simple(src:&[u8],dst:&mut [u8])->errcode::RESULT {
50    let src_len = src.len();
51    let dst_len = dst.len();
52
53    if dst_len<src_len {
54        return errcode::ERROR_BUFFER_TOO_SMALL;
55    }
56    
57    for i in 0..src_len {
58       dst[i] ^= src[i]
59    }
60
61    for k in src_len..dst_len {
62        dst[k] ^=0u8;
63    }
64    return errcode::RESULT_SUCCESS
65}
66
67pub fn log2(v:u64)->usize {
68    if v==0 {
69        return 0
70    }
71    for i in 1..u64::BITS+1 {
72        if v>>i == 0 {
73            return (i-1) as usize
74        }
75    }
76    return 0
77    
78}
79
80///将第二个数组合并到第一个数组中,并且去重
81pub fn merge_slice<T>(v1:&mut Vec<T>,v2:&Vec<T>) 
82    where T:PartialEq+Clone {
83        for s in v2 {
84            if !v1.contains(s){
85                v1.push((*s).clone())
86            }
87        }
88}
89
90///将第二个数组合并到第一个数组中,并且去重
91use std::hash::Hash;
92pub fn merge_slice2<T>(v1:&mut Vec<T>,v2:&Vec<T>) 
93    where T:PartialEq+Clone+Eq+Hash+Sized {
94        use std::collections::HashSet;
95        let mut m:HashSet<T>=HashSet::with_capacity(v1.len()<<1);
96        m=v1.iter().map(|x| x.clone()).collect();
97        /*
98        for i in 0..v1.len() {
99            m.insert(v1[i].clone());
100        }        */
101
102        for s in v2{
103            if !m.contains(s) {
104                v1.push(s.clone())
105            }
106        }
107}