LINUX.ORG.RU

Вычисление хешей из строк в файле

 ,


0

2

Привет всем! У меня есть два файлика csv, в первом одна строка:

aaaaa;bbbbbbbb

Во втором просто:

bbbbbbbb

Мне надо посчитать хеши для этих значений и я набросал что-то подобное:

val parser = CSVParser.parse(new FileReader(input), CSVFormat.EXCEL.withDelimiter(delimiter))
val line = parser.getRecords.asScala.map(record => {
  record.iterator().asScala.filter(_.trim.nonEmpty).map(value => {
    Base64.encode(Blake2b512.hash(value.trim))
  }).toList
})

println(line.foldLeft(List.empty[String])((acc, t) => acc ++ t))

Здесь delimiter - это `;`, input - путь до файла. Результат выполнения:

List(J26qA0M6CELrh5wNkMS8Jh5peJoMJa/j1UtUE+9ABwAKz5YcXx473prQylmlXt0gxdUGhX3TGY3cKpg9tZfVng==)

List(aTbBrHUvRSn7eO9F/FgZ5KhPY0shvUWssNuENtpnF66Xr4Cy+Wve1W4olK3RGIu8DLc5mr7cpSu5wSU562R/Lw==,
FNcps5PCPsNNef/2uKREMMf4q+IE1jd/tNtumFgngf5QtovNgqk3st6efuCazW99+S8Q9t4VekNFZl/ekdKNUA==)

И у меня возник вопрос, почему для одной и той же строки(`bbbbbbbb`) посчитался разный хеш? При том, что если поменять местами `bbbbbbbb` и `aaaaa`, то хеш одинаковый будет в обоих случаях для `bbbbbbbb`.

Почему порядок расположения строк влияет на расчет хеша?

Мне казалось, что если строки равные, то и хеши посчитаются одинаково.

Я тестировал это на библиотеке scrypto(но также пробовал и Guava и commons-codec).

Спасибо за ваши ответы!

Ответ на: комментарий от maxcom

Обычные строки, которые я жду

  val parser = CSVParser.parse(new FileReader("2.csv"), CSVFormat.EXCEL.withDelimiter(';'))
  val line = parser.getRecords.asScala.foreach(record => {
    record.iterator().asScala.filter(_.trim.nonEmpty).foreach(value => {
      print(s"$value ")
    })
  })

Напечатает:

aaaaa bbbbbbbb
aarexer ()

замечание от мимокрокодила

если поменять местами `bbbbbbbb` и `aaaaa`, то хеш одинаковый будет в обоих случаях для `bbbbbbbb`.

Почему порядок расположения строк влияет на расчет хеша?

Мне казалось, что если строки равные, то и хеши посчитаются одинаково.

Похоже хеш для 2-й строки считается «не с нуля», а на основе 1-й строки. Но «так быть не должно» :(

anymouze ()

В общем, там была куча проблем

1) Там иногда встречался BOM

2) В этой НОВОМОДНОЙ библиотечке блэйк кодировка(внутри либы) бралась дефолтовая, а руками явно проставить было нельзя

Все решилось, всем спасибо! Отписал только сейчас, так как был занят

Выводы:

1) Внимательней к содержимому файлов и сразу проверять на непечатные символы

2) Использовать новые библиотечки с умом и осторожностью, а лучше юзать что-то старое и проверенное для таких случаев

aarexer ()
Последнее исправление: aarexer (всего исправлений: 1)