簡體   English   中英

MySQL插入多個唯一行

[英]Mysql insert multiple unique rows

想知道是否可以完成此過程而沒有任何數據錯誤。 使用PHP7和MySQL innoDB。 這仍處於理論階段,如果您能在項目開始前給出良好的建議和建議,將會有很大的幫助。

情況將是存在多個事務,並且即使在幾微秒內也可能同時發生多個事務。 transaction表將具有一個哈希列,其中哈希值是該交易的所有信息+鹽+先前哈希值條目(如果存在)的哈希值。

該過程將是:

  1. PHP將收到交易訂單(用戶信息,金額等)
  2. PHP獲取上一個交易哈希值(如果存在)
  3. 如果不存在任何事務(第一個事務),PHP將對整個事務信息進行哈希處理(sha256),Hx0,MySQL將使用哈希值Hx0創建它的第一個條目
  4. 如果之前已經有事務,PHP將獲取先前的哈希值(Hx0)並將其與整個當前事務信息(sha256)一起哈希,Hx1 {Hx0}和MySQL將在數據庫中創建新條目
  5. 此過程在PHP和MySQL之間重復一路,Hxn + 1 {Hxn}

我擔心的是,如果多個事務同時發生,是否有可能使用前一個事務的相同哈希值進行多個事務?

例如,最新的Tx哈希值是abcd。 如果5個新事務在微秒內同時進行,那5個會使用相同的最新Tx哈希值abcd嗎? 我試圖實現的結果是,它將是有序的並且正確使用了最新的哈希值。

[編輯]讓我嘗試更清楚地解釋。

  1. 第一筆交易將具有哈希值hash(info + timestamp) =“ acbd”
  2. 第二筆交易的值將為hash(info + timestamp + "abcd") =“ cdfg”
  3. 第三筆交易的值將為hash(info + timestamp + "cdfg") =“ hijk”

我擔心的是,如果在第三次交易之后的3毫秒或十億分之一秒內同時輸入3筆交易,新的3筆交易會如下嗎? (第四筆交易仍使用先前的哈希值進行哈希處理,而第五筆交易和第六筆交易也使用相同的先前哈希值進行哈希處理,而第四筆交易甚至無法完成並更新至數據庫):

  1. 第四次交易hash(info + timestamp + "hijk") =“ 12sd”
  2. 第五次交易hash(info + timestamp + "hijk") =“ x3sd”
  3. 第六次交易hash(info + timestamp + "hijk") =“ n76h”

我希望並希望我的結果是:

  1. 第四次交易hash(info + timestamp + "hijk") =“ 12sd”
  2. 第五次交易hash(info + timestamp + "12sd") =“ mn34”
  3. 第六次交易hash(info + timestamp + "mn34") =“ 09lk”

計划B是(您怎么看?):

  1. 創建兩個表。 一個(表A)接收所有事務而不進行哈希處理,另一個(表B)一個接一個地哈希表A中的每個事務。
  2. 表A將插入所有條目,無論它是否同時處於納秒級。
  3. 表B會很高興地遍歷表A,並逐個哈希每個條目,這些條目也不受同時事務的影響,並且哈希值順序正確。

取決於您的哈希函數用作參數的方式。 讓我教您哈希函數背后的數學美:

無碰撞和堅固性

散列函數的目的是不產生沖突並且具有魯棒性

  • 什么是碰撞 f作為哈希函數,將xy視為兩個不同的字符串。 如果存在兩個不同的字符串xy ,那么f(x) = f(y)就會發生沖突。 顯然這不是很好 因此,哈希函數的設計使其不會產生沖突。
  • 什么是魯棒性 與前面的情況不同,現在讓xy是兩個相等的字符串。 無論何時在相同的字符串上運行,我們都希望哈希函數返回相同的值,因此哈希函數是健壯的,如果對於x = y ,它也是f(x) = f(y)

現在我們知道了,我們必須問自己要傳遞給哈希函數的內容。 顯然,每個用戶之間都有一些區別,例如密碼,用戶名,電子郵件以及它們的組合。 我們也可以添加一些 ,例如日期,以使其更復雜,但實際上沒有必要。

你的情況

因此,基本上,您要擔心的只是要散列的數據,即用戶名,數量等。由於PHP腳本將針對每個事務分別運行,並且由於要散列的數據會有所不同(數量,時間等可能相同,但用戶名會有所不同),因此無需擔心沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM