【问题标题】:What is the best way to hash lines from text file using Java?使用 Java 从文本文件散列行的最佳方法是什么?
【发布时间】:2022-11-17 01:43:34
【问题描述】:

我正在尝试从格式为的文本文件中提取数据:

Name: James
Location: London
Time: 15.11.2022_15.53.37

我想在第二行之后:so (James, London, 15.11.2022_15.53.37) 获取括号中的数据并使用该数据创建哈希值。

我在考虑独立阅读每一行并添加一个 for 循环哈希?然后将散列存储在变量中。

我尝试使用 BufferedReader 并且可以提取数据,但是不确定如何提取数据的第二列并添加哈希。

【问题讨论】:

  • 什么意义上的最佳?
  • 您可能最好将信息存储在一个对象中,例如 Meeting 类型(作为猜测),然后使用其 hashCode 方法。散列它的目的是什么?
  • 为什么不散列整行?将 Time: 之类的常量字符串添加到哈希的所有输入中不会有任何区别。
  • 至于读取数据(忽略散列位):它看起来像一个属性文件。如果是,您可以使用java.util.Properties
  • 如果您只是单独散列每一行,您将遇到诸如空格之类的内容可能会更改上下文相同信息的散列结果的问题。假设您使用散列来实现数据完整性或跟踪以前遇到的数据,您应该使用更正式的方法,例如 @g00se 建议的方法。这样,具有相同数据的对象的哈希值是一致的。

标签: java hash bufferedreader


【解决方案1】:

我更喜欢上面针对业务域对象建议的方法,但您可以使用这种快速而肮脏的方法来获取 Map 的“记录号”到每个记录中每个“字段”的哈希码:

import java.util.List;
import java.util.Map;
import java.nio.file.Files;
import java.nio.file.Paths;
import static java.util.stream.Collectors.*;
import java.util.concurrent.atomic.AtomicInteger;

public class RecordHashcodes {
    public static void main(String[] args) {
        try {
            List<String> list = Files.readAllLines(Paths.get(args[0]));
            int groupBy = 3;

            AtomicInteger index = new AtomicInteger(0);
            Map<Integer, List<Integer>> groups = list.stream()
                .map(field -> field.replaceAll("^.+:\s*", "").trim())
                .collect(groupingBy(cdm -> index.getAndIncrement() / groupBy, mapping(f -> f.hashCode(), toList())));

            System.out.println(groups);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2011-11-19
    • 2010-10-02
    • 2011-08-04
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多