Как правильно сохранять данные, считываемые из файла в области видимости, в Rust? - PullRequest
0 голосов
/ 03 августа 2020
  • Я новичок в Rust.
  • Я читаю SHA1-как-шестнадцатеричные строки из файла - их много, прибл. 30 миллионов.
  • В текстовом файле они отсортированы по возрастанию.
  • Я хочу иметь возможность выполнять поиск в списке как можно быстрее.
  • Я (думаю I) хочу прочитать их в (отсортированном) Vec< primitive_type :: U256 > для быстрого поиска.

Итак, я пробовал:

log("Loading haystack.");
// total_lines read earlier
let mut the_stack = Vec::<primitive_types::U256>::with_capacity(total_lines);
if let Ok(hay) = read_lines(haystack) { // Get BufRead
  for line in hay { // Iterate over lines
    if let Ok(hash) = line {
      the_stack.push(U256::from(hash));
    }
  }
}
log(format!("Read {} hashes.", the_stack.len()));

Ошибка:

$ cargo build
   Compiling nsrl v0.1.0 (/my_app)
error[E0277]: the trait bound `primitive_types::U256: std::convert::From<std::string::String>` is not satisfied
  --> src/main.rs:55:24
   |
55 |         the_stack.push(U256::from(hash));
   |                        ^^^^^^^^^^ the trait `std::convert::From<std::string::String>` is not implemented for `primitive_types::U256`
   |
   = help: the following implementations were found:
             <primitive_types::U256 as std::convert::From<&'a [u8; 32]>>
             <primitive_types::U256 as std::convert::From<&'a [u8]>>
             <primitive_types::U256 as std::convert::From<&'a primitive_types::U256>>
             <primitive_types::U256 as std::convert::From<&'static str>>
           and 14 others
   = note: required by `std::convert::From::from`

Этот код работает, если вместо переменной hash у меня есть строковый литерал, например "123abc".

Думаю, я должен иметь возможность использовать реализацию std::convert::From<&'static str>, но я не понимаю, как я должен сохранить hash в рамках?

Я чувствую, что то, что я пытаюсь достичь, вполне нормально вариант использования:

  • Итерировать по строкам в файле.
  • Добавить строку в вектор.

Что мне не хватает?

1 Ответ

0 голосов
/ 03 августа 2020

Вы почти хотите что-то вроде

U256::from_str(&hash)?

Существует преобразование из &str в черту FromStr, называемое from_str. Он возвращает значение Result<T, E>, потому что синтаксический анализ строки может завершиться неудачно.

Я думаю, что смогу использовать реализацию std::convert::From<&'static str>, но я не понимаю, как я должен сохранить ha sh в области действия?

Вы не можете сохранить ha sh в области действия с временем жизни 'static. Похоже, что это удобный метод, позволяющий использовать строковые константы в вашей программе, но на самом деле это не более чем U256::from_str(&hash).unwrap().

Однако ...

Если вам нужен SHA- 1, лучшим типом, вероятно, является [u8; 20] или, может быть, [u32; 5].

Вам нужен декодер base 16, например base16 :: decode_slice . Вот как это может выглядеть в действии:

/// Error if the hash cannot be parsed.
struct InvalidHash;

/// Type for SHA-1 hashes.
type SHA1 = [u8; 20];

fn read_hash(s: &str) -> Result<SHA1, InvalidHash> {
    let mut hash = [0; 20];
    match base16::decode_slice(s, &mut hash[..]) {
        Ok(20) => Ok(hash),
        _ => Err(InvalidHash),
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...