pedersen_hash_function/
lib.rs1use mathematics::extended_euclidean_algorithm;
2
3
4pub fn pedersen_hash_function(x:u64, y:u64, z: u64, mod_num:u64) -> u64{
32 let generators = natural_numbers_generators(mod_num);
33 let mut h = 1;
34 let mut input: Vec<u64> = Vec::new();
35 input.push(x);
36 input.push(y);
37 if z != 0{
38 input.push(z);
39 }
40 loop{
41 for (index, item) in input.clone().into_iter().enumerate(){
42 let generator = generators.get(index).unwrap_or(&0);
43 let hash = generator.pow(item as u32) ;
44 h *= hash ;
45 }
46 if generators.len() >= input.len() {
47 break;
48 }
49 }
50 let pedersen_hash = h % mod_num ;
51 pedersen_hash
52}
53pub fn natural_numbers_generators( mod_num:u64 ) -> Vec<u64> {
68let mod_num_vec = create_vec_to_n(mod_num-1);
69let mut generators:Vec<u64> = Vec::new();
70let mut elements :Vec<u64>= vec![];
71let mut new_vectors: Vec<Vec<u64>> = Vec::new();
72let mut generator: u64 = 1;
73
74while mod_num > generator{
75generator+=1;
76for item in &mod_num_vec{
77if extended_euclidean_algorithm(generator.try_into().unwrap(),mod_num.try_into().unwrap() ).0 ==1{
78 let result = generator.pow((*item).try_into().unwrap())% mod_num;
79 elements.push(result);
80};
81}
82 new_vectors.push(elements.clone());
83 let mut elements_sorted= elements.clone();
84 let mut mod_num_vec_sorted = mod_num_vec.clone();
85 elements_sorted.sort();
86 mod_num_vec_sorted.sort();
87 if mod_num_vec_sorted == elements_sorted{
88 generators.push(generator );
89
90 }
91elements = [].to_vec();
92}
93generator = 1;
94generators
95
96}
97
98fn create_vec_to_n(n: u64) -> Vec<u64> {
99 (1..=n).collect()
100}
101
102#[cfg(test)]
103mod tests {
104 use super::*;
105
106 #[test]
107 fn test1() {
108 let peserden_hash=pedersen_hash_function(1 ,2, 0, 5);
109 assert_eq!(peserden_hash,3);
110
111 }
112 #[test]
113 fn test2() {
114 let peserden_hash=pedersen_hash_function(3 ,7, 11, 13);
115 assert_eq!(peserden_hash,8);
116
117 }
118 #[test]
119 fn test3() {
120 let generator=natural_numbers_generators(5);
121 assert_eq!(generator, [2,3]);
122
123 }
124}