我想驗證本地數據庫(實際上是一個文件系統,但對於本次討論,我想保持這種簡單)。該數據庫具有以下屬性:生成可驗證的隨機數 - Java
它可以有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快一些。
所以我想的更多的創造性的解決方案... 如果我生成種子是這樣的: 種子= HASH(表名)^ HASH(列名)^^PK1 PK2 現在我可以很容易地計算種子給定pk1和pk2,同時仍然保持東西在表格之間有點隨機... 列名可以在表中重複相同的pk1和pk2值...但從功能上講,它們應該具有相同的值.. – walletless 2012-02-07 19:11:52
另一種選擇是追求Philipp Wendler在下面提出的建議: 使用表格的第一列來存儲使用的種子。如果這是一個int或long,只要將種子原樣存儲在其中即可。如果這是一個字符串,則使用前n個字節來存儲種子,並使用使用該種子生成的字符將字段填充到所需的長度。 – walletless 2012-02-07 19:26:31
你也生成主鍵嗎?如果是,您可以使用它們來存儲其他列的散列。這可能會給你一些碰撞插入當然(但如果你隨機生成pk,這也可能發生) – wmz 2012-02-07 19:32:22