Mysql插入多个唯一行

时间:2017-09-04 15:35:28

标签: php mysql hash transactions

想知道是否可以在没有任何数据错误的情况下完成此过程。使用PHP7和MySQL innoDB。这仍处于理论阶段,如果你能在项目开始之前给出好的意见和建议,那将是一个巨大的帮助。

案件将是多个交易,即使在几微秒内也可能同时发生多个交易。 transaction表将具有散列列,其中散列值是该事务的所有信息的散列+ salt +前一个散列值条目(如果存在)。

过程将是:

  1. PHP将收到交易订单(用户信息,金额等)
  2. PHP获取上一个事务哈希值(如果存在)
  3. 如果没有事务存在(第一个事务),PHP将散列整个事务信息(sha256),Hx0和MySQL将创建它的第一个条目,哈希值为Hx0
  4. 如果之前已有事务,PHP将采用先前的哈希值(Hx0)并将其与整个当前事务信息(sha256)一起哈希,Hx1 {Hx0}和MySQL将在数据库中创建新条目< / LI>
  5. 此过程在PHP和MySQL之间重复,Hxn + 1 {Hxn}
  6. 我担心的是,如果这些交易同时发生,是否有可能使用前一交易的相同散列值进行多次交易?

    例如,最新的Tx散列值为abcd。如果5个新事务在微秒内同时进入,那5个将使用相同的最新Tx散列值abcd吗?我试图实现的结果是它将按顺序正确使用最新的散列值。

    [编辑] 让我试着更清楚地解释一下。

    1. 第一个交易的值为hash hash(info + timestamp) =&#34; acbd&#34;
    2. 第二笔交易的价值为hash(info + timestamp + "abcd") =&#34; cdfg&#34;
    3. 第三笔交易的价值为hash(info + timestamp + "cdfg") =&#34; hijk&#34;
    4. 我担心的是,如果3笔交易在第三笔交易后的微秒或纳秒内同时进入,那么新的3笔交易是否如下所示? (第四个事务仍然使用前一个哈希进行哈希处理,而第五个事务和第六个事务也使用相同的先前哈希进行哈希处理,之后第四个事务甚至设法完成并更新到数据库):

      1. 第四次交易hash(info + timestamp + "hijk") =&#34; 12sd&#34;
      2. 第五次交易hash(info + timestamp + "hijk") =&#34; x3sd&#34;
      3. 第六次交易hash(info + timestamp + "hijk") =&#34; n76h&#34;
      4. 我希望并希望我的结果是:

        1. 第四次交易hash(info + timestamp + "hijk") =&#34; 12sd&#34;
        2. 第五次交易hash(info + timestamp + "12sd") =&#34; mn34&#34;
        3. 第六次交易hash(info + timestamp + "mn34") =&#34; 09lk&#34;
        4. B计划(你怎么看?):

          1. 创建两个表。一个(表A)接收所有没有散列的事务,另一个(表B)逐个散列表A中的每个事务。
          2. 表A将插入所有条目,无论它是否同时为纳秒级。
          3. 表B将很乐意通过表A并逐个散列每个条目,这些条目也不会受到同步事务的影响并且正确地按顺序排列哈希值。

1 个答案:

答案 0 :(得分:0)

取决于您的散列函数用作参数的内容。让我教你散列函数背后的数学美:

无碰撞和稳健性

哈希函数意味着不会创建冲突并且健壮

  • 什么是碰撞?将f视为散列函数,将xy视为两个不同的字符串。如果存在两个不同的字符串xy,则f(x) = f(y)会发生冲突。显然这是非常不好。因此,散列函数的设计使它们不会产生碰撞。
  • 什么是健壮性?与之前的情况不同,现在让xy成为两个相等的字符串。我们希望散列函数返回相同的值,无论我们在相同的字符串上运行它,因此散列函数是健壮的,如果对于x = y,它也是f(x) = f(y)

现在我们知道了,我们必须问自己我们想要传递给哈希函数的是什么。显然,某些东西与用户不同,例如密码,用户名,电子邮件,这些的组合。我们也可以添加一些东西,一个 salt ,就像日期一样,只是为了让它更复杂,但实际上没有必要。

您的案例

所以基本上你要担心的只是你要用什么数据进行散列,即用户名,数量等等。由于PHP脚本将针对每个事务单独运行,因为你将要散列的数据将是不同的(金额,时间等可能相同,但用户名会有所不同),无需担心碰撞。