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).

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


Убери хеш и base64 и посмотри что за строки у тебя вылезают из твоего кода разбора CSV.

maxcom ★★★★★
()
Ответ на: комментарий от 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
() автор топика

Чудес не бывает. Поставь брякпоинт в дебаггере и посмотри строки по символам. Если хеши разные, значит строки разные.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от anonymous

Тоже так думал, но:

println(value.contains(Platform.EOL)) // false

aarexer
() автор топика

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

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

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

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

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

anymouze ★★
()
Ответ на: комментарий от anymouze

Blake2b512.reset() между вызовами кэша

anonymous
()

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

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

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

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

Выводы:

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

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

aarexer
() автор топика
Последнее исправление: aarexer (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.