Генерация проверяемых случайных чисел - Java - PullRequest
3 голосов
/ 07 февраля 2012

Я пытаюсь проверить базу данных правильных данных (на самом деле, файловую систему, но для этого обсуждения я хочу сохранить это простым). База данных имеет следующие свойства:

Может иметь 1 или 2 первичных ключа, и они ДОЛЖНЫ быть целыми числами. Столбцы могут быть строковыми (не разрешенными ascii), целыми, длинными или datetime

Я хочу проверить, правильно ли хранятся значения, которые я запрашиваю в этой базе данных, с большим количеством записей (> 500 тыс. Записей). Поэтому для этого я хочу расширить инструмент, который генерирует данные, которые я могу легко проверить позже.

Итак, в принципе, скажем, что это пример схемы:

pk1 (int - primary key)
pk2 (int - primary key)
s1 (string)
l1 (long)
i1 (int)

Я хочу создать 500 тыс. Записей с помощью этого инструмента. Затем, в любой момент, я хочу иметь возможность проверить правильность записи. Я мог бы выполнить ряд операций (например, выполнить резервное копирование, затем восстановить базу данных), а затем «провести выборочную проверку» нескольких записей. Поэтому я хочу иметь возможность быстро проверить правильность записи для записи для первичного ключа (pk1 = 100, pk2 = 1).

Каков наилучший способ создания значений для каждого столбца, чтобы его можно было легко проверить позже. Значения не обязательно должны быть полностью случайными, но они также не должны повторяться часто, поэтому некоторые из логики сжатия могут быть также затронуты.

В качестве примера, скажите «как-то», инструмент сгенерировал следующее значение для строки:

pk1 = 1000
pk2 = 1
s1 = "foobar"
l1 = 12345
i1 = 17

Теперь я выполняю несколько операций и хочу убедиться, что в конце этого ряд не был поврежден. Я должен иметь возможность быстро генерировать ожидаемые значения для s1, l1 и i1 - учитывая pk1 = 1000 и pk2 = 1 - так что это может быть проверено очень быстро.

Идеи

(Я не могу опубликовать ответ на свой вопрос, так как я новичок, так что добавьте это :) Итак, я должен найти возможные подходы:

Подход № 1: используйте HASH (имя таблицы) ^ HASH (имя поля) ^ pk1 ^ pk2 в качестве начального числа. Таким образом, я могу легко вычислить начальное значение для каждого столбца при проверке. С другой стороны, это может быть дорого при генерации данных для большого количества строк, поскольку начальное число нужно вычислять один раз для столбца. Таким образом, для вышеупомянутой схемы у меня было бы 500k * 3 семени (для генерации 500k записей).

Подход № 2 (предложен Филиппом Вендлером): Создайте одно семя на строку и сохраните семя в первом столбце этой строки. Если первый столбец имеет тип int или long, сохраните значение как есть. Если первый столбец является строкой, сохраните начальное число в первых x байтах, а затем дополните его до необходимой длины строки символами, сгенерированными с использованием этого начального числа.

Мне больше нравится подход № 2, потому что в каждой строке только одно начальное число - что делает генерацию данных несколько быстрее, чем подход № 1.

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Вы можете просто генерировать произвольные случайные данные, вычислять хеш-код (например, MD5, поскольку он не должен быть криптографически защищенным) и сохранять хеш-код вместе с вашими данными.У вас может быть отдельный столбец для хеш-кода или, например, вы можете добавить его к любому строковому столбцу.

Для проверки отделите сохраненный хеш-код от остальных данных в этой строке, пересчитайте зановохеш-код и сравнить их на равенство.Если они не совпадают, ваши данные были изменены.

Это предполагает, что вы хотите защитить свои данные только от случайных изменений (не от злоумышленника).

0 голосов
/ 07 февраля 2012

Это отвечает только на вторую часть вашего вопроса - как насчет того, чтобы сделать l1 для хранения хеша всех других полей?Тогда вы сможете быстро проверить, не повреждено ли что-либо

0 голосов
/ 07 февраля 2012

Может быть, что-то из Apache Commons может быть решением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...