亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

生成同時訪問的唯一編號

生成同時訪問的唯一編號

PHP
一只斗牛犬 2023-10-01 15:56:44
情況:人們會在我的系統上訂購門票,我想生成門票號碼。該應用程序并不是那么大,而且已經可以運行了。后端完全用 vanilla php 編寫。但我一次只對一名用戶進行測試?,F在我猜想多個用戶有可能同時訪問票證訂單,因為公司內訂購的時間窗口很短。數據庫 (MongoDB) 將每個事件保存為文檔。每個文檔都有一個字段,用于保存第一個免費票號。付款過程結束后,php 腳本檢查用戶購買了多少張票,然后開始生成票號(獲取當前值 -> 增加 -> 將其保存到數據庫 -> 等)?,F在,當兩個人同時執行此操作時,可能會發生這樣的事情:兩個人都將獲得 2314 作為當前可用數字,并且隨后都會增加該數字?,F在有兩張票號相同的票。我考慮更改為 sql 并獲取插入行的 id,因為這已經是一個唯一的數字。我也想過取當前時間+鹽并對其進行哈希處理(但這樣就會出現殘酷的票號)。但我想知道是否有可能在不使用 sql 之類的 db 函數的情況下實現這一目標。我想這在其他場景中也很有用,在這些場景中我可能無法使用諸如 sql 之類的東西。我想過“阻止對數字/函數的訪問”之類的事情,直到第一個調用函數再次釋放它。
查看完整描述

2 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

您可以使用hrtime()

<?php

// hrtime

echo hrtime(true).PHP_EOL.

? ? hrtime(true).PHP_EOL.

? ? hrtime(true).PHP_EOL.

? ? hrtime(true).PHP_EOL.

? ? hrtime(true).PHP_EOL;

? ??

// microtime

echo microtime(true).PHP_EOL.

? ? microtime(true).PHP_EOL.

? ? microtime(true).PHP_EOL.

? ? microtime(true).PHP_EOL.

? ? microtime(true).PHP_EOL.

? ? microtime(true);

結果:


25558478919927842

25558478919929611

25558478919930289

25558478919930576

25558478919930779

1597318697.2849

1597318697.2849

1597318697.2849

1597318697.2849

1597318697.2849

1597318697.2849

上面相當于幾個用戶會同時訪問機票訂單。正如你所看到的,微時間是不夠的。


但您可以使用上面的最后 5 個數字,即 27842,并且很可能是唯一的。


除此之外,您可以在前面放置一個用戶 ID 以獲得更多熵。


如果您想要連續且 100% 防止重復,那么您唯一的選擇是使用存儲在數據庫中的增量 ID。


查看完整回答
反對 回復 2023-10-01
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

如果票號不必按特定順序排列,您可以生成隨機票號:


function generate_string($input, $strength = 10) {


$input_length = strlen($input);

$random_string = '';

for ($i = 0; $i < $strength; $i++) {

    $random_character = $input[random_int(0, $input_length - 1)];

    $random_string .= $random_character;

}


return $random_string;

}

與例如


$input = '0123456789';

甚至


$input = '0123456789ABCDEF';

對于十六進制票號。


查看完整回答
反對 回復 2023-10-01
  • 2 回答
  • 0 關注
  • 159 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號