我正在尝试验证一个专业数据库(实际上,一个文件系统,但对于这个讨论,我想保持这个简单)。该数据库具有以下属性:
它可以有1个或2个主键,它们必须是整数。 列可以是字符串(非ascii允许),整数,长整数或日期时间
我想验证我要求此数据库存储的值是否正确存储了大量记录(> 500k记录)。因此,我想扩展一个生成数据的工具,以后我可以轻松验证。
所以基本上,这是示例模式:
pk1 (int - primary key)
pk2 (int - primary key)
s1 (string)
l1 (long)
i1 (int)
我想用这个工具生成500k记录。然后,在任何给定的时间,我希望能够理智地检查给定的记录。我可能会执行一系列操作(比如备份,然后恢复数据库),然后“抽查”几条记录。所以我希望能够快速验证主键(pk1 = 100,pk2 = 1)的记录条目是否有效。
为每列生成值的最佳方法是什么,以便以后可以轻松验证。值不一定是完全随机的,但它们也不应经常重复,因此也可能会遇到一些压缩逻辑。
作为一个例子,说“不知何故”该工具为一行生成了以下值:
pk1 = 1000
pk2 = 1
s1 = "foobar"
l1 = 12345
i1 = 17
现在我执行了几个操作,我想验证在这一行结束时,这一行没有被破坏。我必须能够快速生成s1,l1和i1的预期值 - 给定pk1 = 1000和pk2 = 1 - 因此可以非常快速地验证它。
想法?
(我不能回答我自己的问题,因为我是新用的,所以加上这个:) 好的,所以我必须采取可行的方法:
方法#1: 使用HASH(tablename)^ HASH(fieldname)^ pk1 ^ pk2作为种子。这样,我可以在验证时轻松计算每列的种子。另一方面,在为大量行生成数据时,这可能很昂贵,因为种子需要每列计算一次。所以对于上面的模式,我会有500k * 3种子(生成500k记录)。
方法#2(Philipp Wendler提议): 每行生成一个种子,并将种子存储在该行的第一列中。如果第一列是int或long,则按原样存储该值。如果第一列是字符串,则将种子存储在前x个字节中,然后将其填充到所需的字符串长度,并使用该种子生成字符。
我更喜欢方法#2,因为每行只有一个种子 - 使数据生成速度比方法#1快。
答案 0 :(得分:1)
您可以生成任意随机数据,计算哈希代码(例如MD5,因为它不需要加密安全)并将哈希代码与您的数据一起存储。您可以为哈希代码添加单独的列,例如,您可以将其附加到任何字符串列。
为了验证,将存储的哈希码与该行中的其余数据分开,重新计算哈希码并将它们进行相等性比较。如果它们不匹配,则会修改您的数据。
这假设您只想保护数据免受意外修改(而不是来自恶意攻击者)。
答案 1 :(得分:0)
答案 2 :(得分:0)
这只回答你问题的第二部分 - 如何让l1存储所有其他字段的哈希值?然后,您可以快速验证是否有任何损坏