Для слоя кеширования мне нужно создать уникальный ша для хэша. Он должен быть уникальным для содержимого этого хэша. Два хэша с одинаковой конфигурацией должны иметь один и тот же шаг.Как сгенерировать уникальный идентификатор хэша с определенным контентом?
in_2014 = { scopes: [1, 2, 3], year: 2014 }
not_in_2104 = { scopes: [1, 2, 3], year: 2015 }
also_in_2014 = { year: 2014, scopes: [1, 2, 3] }
in_2014 == also_in_2014 #=> true
not_in_2104 == in_2014 #=> false
Теперь для того, чтобы сохранить его и быстро посмотреть эту игру, он должен быть включен в нечто shasum. Просто преобразования в строку не работает, так генерируя hexdigest от него не работает либо:
require 'digest'
in_2014.to_s == also_in_2014.to_s #=> false
Digest::SHA2.hexdigest(in_2014.to_s) == Digest::SHA2.hexdigest(also_in_2014.to_s) #=> false
То, что я хочу, это shasum или какой-либо другой идентификатор, который позволит мне сравнить хэши друг с другом. Я хочу что-то вроде последнего теста, который вернет true, если содержимое хэшей будет соответствовать.
Я мог бы сортировать хэши до to_s
, но это кажется неуклюжим для меня. I am, для одного, боюсь, что я что-то пропускаю (sort
возвращает массив, уже не хэш, для одного). Есть ли что-то простое, что я пропускаю? Или это вообще невозможно?
FWIW, нам нужно это в сценарии, как показано ниже:
Analysis.find_by_config({scopes: [1,2], year: 2014}).datasets
Analysis.find_by_config({account_id: 1337}).datasets
class Analysis < ActiveRecord::Base
def self.find_by_config(config)
self.find_by(config_digest: shasum_of(config))
end
def self.shasum_of(config)
#WAT?
end
def before_saving
self.config_digest = Analysis.shasum_of(config)
end
end
Обратите внимание, что здесь, анализ делает не есть столбцы «области» или «год» или « ACCOUNT_ID». Это произвольные конфиги, которые нам нужны только для просмотра наборов данных.
Если это кеш, действительно ли имеет значение, если вы периодически повторяете записи? –
Повторяющиеся записи будут иметь значение в некоторых случаях. Кэш существует, потому что генерация «наборов данных» на самом деле (как и в течение десяти минут вычислительного времени для каждого конфигурационного файла) является дорогостоящей.Следовательно, мы хотим сохранить конфигурацию, попросите фонового рабочего рассчитать набор данных и с этого момента, сразу же передайте наборы данных для определенной конфигурации. – berkes