| 208 | } |
| 209 | |
| 210 | fn sha2_binary_bitlen_iter<'a, BinaryArrType, I>( |
| 211 | values: &BinaryArrType, |
| 212 | bit_lengths: I, |
| 213 | ) -> ArrayRef |
| 214 | where |
| 215 | BinaryArrType: BinaryArrayType<'a>, |
| 216 | I: Iterator<Item = Option<i32>>, |
| 217 | { |
| 218 | let array = values |
| 219 | .iter() |
| 220 | .zip(bit_lengths) |
| 221 | .map(|(value, bit_length)| match (value, bit_length) { |
| 222 | (Some(value), Some(224)) => { |
| 223 | let mut digest = sha2::Sha224::default(); |
| 224 | digest.update(value); |
| 225 | Some(hex_encode(digest.finalize())) |
| 226 | } |
| 227 | (Some(value), Some(0 | 256)) => { |
| 228 | let mut digest = sha2::Sha256::default(); |
| 229 | digest.update(value); |
| 230 | Some(hex_encode(digest.finalize())) |
| 231 | } |
| 232 | (Some(value), Some(384)) => { |
| 233 | let mut digest = sha2::Sha384::default(); |
| 234 | digest.update(value); |
| 235 | Some(hex_encode(digest.finalize())) |
| 236 | } |
| 237 | (Some(value), Some(512)) => { |
| 238 | let mut digest = sha2::Sha512::default(); |
| 239 | digest.update(value); |
| 240 | Some(hex_encode(digest.finalize())) |
| 241 | } |
| 242 | // Unknown bit-lengths go to null, same as in Spark |
| 243 | _ => None, |
| 244 | }) |
| 245 | .collect::<StringArray>(); |
| 246 | Arc::new(array) |
| 247 | } |
| 248 | |
| 249 | const HEX_CHARS: [u8; 16] = *b"0123456789abcdef"; |
| 250 | |