Как я могу создать надежный дайджест из хэша в Ruby 2.4? - PullRequest
2 голосов
/ 26 апреля 2019

У меня очень большая таблица, содержащая 2 миллиарда строк по 50 атрибутов. Не все заполнены и это редкая матрица.

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

Для моего нового подхода я хочу добавить дайджест-столбец, содержащий дайджест всех атрибутов в определенной строке.

Для этого хэша нет требований безопасности, так что даже MD5 подойдет.

Мне лучше построить простую строку, содержащую представления всех ключей и значений вместе? Или есть лучший способ?

Например, данный хеш:

attr_hash = { attribute1: "Please",
              attribute2: nil,
              attribute3: "don't",
              attribute4: nil,
              attribute5: nil,
              attribute6: nil,
              attribute7: "immediately",
              attribute8: "",
              attribute9: "downvote",
              attribute10: "my",
              attribute11: nil,
              attribute12: "question" }

будет ли это предпочтительнее (и я уверен, вы согласитесь, что это прекрасно):

attr_str = attr_hash.select{|k,v| v!="" && !v.nil?}.keys.sort.map{|k| "#{k}=#{attr_hash[k]}" }.join("^^")
digest = Digest::MD5.hexdigest(attr_str)

, который дает красивую строку:

790470349a791b9897afd52a336ab2bb

Я могу проиндексировать этот столбец и получить очень, очень быстрое время отклика из базы данных. И я вряд ли получу много столкновений от этого. И если есть столкновение один раз в 5 или 10 миллионов раз, это нормально.

Я глубоко ценю любые идеи.

1 Ответ

3 голосов
/ 26 апреля 2019

Ленивый путь:

Digest::SHA2.hexdigest(attr_hash.inspect)

Там, где это предполагает, что ваши предметы имеют одинаковый порядок.Если вам нужно сначала отсортировать элементы:

Digest::SHA2.hexdigest(attr_hash.to_a.sort_by { |k, _v| k }.inspect)

Я бы использовал JSON.dump(x) вместо x.inspect, если бы я хотел что-то более переносимое, например, для кодовых баз без Ruby.

Я бы тоже не стал убирать пустые значения.Хеш-функция не имеет значения.

...