ホームページ >バックエンド開発 >PHPの問題 >PHPで6桁の非繰り返し文字列を生成する方法

PHPで6桁の非繰り返し文字列を生成する方法

藏色散人
藏色散人オリジナル
2021-11-03 10:58:483319ブラウズ

php で 6 桁の非繰り返し文字列を生成する方法: 1. "substr(md5(microtime(true)), 0, 6);" によって最初の 6 桁をインターセプトします; 2. データベースを使用しますbigint を自動インクリメントするフィールド。それを 16 進数に変換して長さを短くするだけです。

PHPで6桁の非繰り返し文字列を生成する方法

この記事の動作環境:Windows7システム、PHP7.1バージョン、DELL G3コンピュータ

6-の生成方法digit non-duplicate php String?

PHP は 6 桁の非反復文字列 (UUID と同様) を生成します

次の点を考慮する必要があります:

1. いいえ複製。

2. セキュリティ。

【機密データを注文生成ルールとして使用することは推奨されません (例: ユーザー UID、注文の自動インクリメント ORDER_ID など)。Web サイトの機密情報の一部が公開される可能性があるためです]

3. 大規模なランダム コードは使用しないでください。

なぜ?

まず最初に、「プログラミング言語におけるランダム性は本当にランダムである可能性があるのでしょうか?」と尋ねますが、少なくとも PHP ではそれができないと自信を持って言えます。したがって、最初の「重複なし」原則が発生する可能性があります。

注文数量が 1,000 万回に達すると、注文コードを生成するたびに 1,000 万個の履歴データを比較する必要があります。 500万にも達すると、データベースの最適化(パーティショニングを使ったり、インデックスを作成したりする単純な処理)に時間を費やさなければなりません。ただし、実用的な要件は高く、メインデータベースで運用する必要がある場合があります。どれだけ苦痛ですか?もちろん、データベースのリアルタイム読み書きのための最適化方法は他にもありますが、ここでは紹介しません)。

4. 同時実行を防止します。

5. 制御桁数。 ######なぜ?

    クエリと検索が簡単
  • 桁数は 10 ~ 20 まで制御できます。もちろん、インターネット上の番号は入力に便利なので 10 ~ 15 です。入力が長すぎる場合は、ユーザー エクスペリエンスを改善するだけです (コピー注文ボタンを追加します)
  • 6。ビジネス上の重要性を持たせるようにしてください (そうではありません)会社の事業内容に応じて必須)

[比較的規模の大きな事業や、後期に大規模な拡大が予定されている場合には、発注の意義を考慮し調整することをお勧めします。会社のビジネスに。最も単純な例を考えてみましょう: 「化粧品を販売するモールの場合、注文元 (PC/モバイル) に基づいてレポートを生成する必要があります。現時点では、"]

7 が必要になる場合があります。解決策

// 类似生成 UUID ,不依赖外部流水号,完全靠时间戳和随机数生成订单号无法避免冲突,
// 所以必须引入外部的流水号生成机制。或使用数据库,或使用APC之类的缓存。
// 用APC之类的缓存存在一个问题,就是无法持久保持数据,服务器重启或者PHP宿主进程重启都会清空流水号计数器,
// 所以可以采取缓存+数据库结合的模式——如果缓存中有流水号计数器数据则读取并累加计数,如果缓存中没有流水号计数器从数据库中还原计数器。
// 计数器可以每隔一段时间重置一次。既然引入了自增流水号计数器,又会导致文章开头的“德国坦克问题”,
// 所以需要用skip32算法把流水号加密
// (https://github.com/nlenepveu/Skip32)。
// 订单号 = 日期前缀 + 加密流水号
// Skip32 算法加密密钥
const ENCRYPTED_KEY = 'xxxxxxxxxxxx';
// 使用 Wincache 作为流水号计数器缓存
function getOrderSerialNumber() {
    $timestamp = time();
    $datePrefix = date('ymd', $timestamp);
// 如果流水号计数器数据不在缓存中,则尝试从数据库中恢复
    if (false === ($value = wincache_ucache_inc($datePrefix))) {
    wincache_lock($datePrefix);
// 从数据库中获取今日的订单数
    $counter = getNumberOfOrdersTodayFromDatabase($timestamp);
    $value = $counter + 1;
if (!wincache_ucache_add($datePrefix, $value, 60*60*24)) {
    $value = wincache_ucache_inc($datePrefix);
}
    wincache_unlock($datePrefix);
}
    return $datePrefix.str_pad(Skip32::encrypt($datePrefix.ENCRYPTED_KEY, $value), 10, '0', STR_PAD_LEFT);
}

簡単な方法:

1. 現在のタイムスタンプは md5 で暗号化されており、最初の 6 桁はインターセプトされます

echo substr(md5(microtime(true)), 0, 6);

2. データベース bigint を使用してフィールドを自動インクリメントし、変換します長さを短くするには、62 にします。

echo gmp_strval(gmp_init('9876543210', 10), 62);

推奨学習: "

PHP ビデオ チュートリアル

"

以上がPHPで6桁の非繰り返し文字列を生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。