ホームページ > バックエンド開発 > PHPチュートリアル > PHP は、繰り返しのない数字と文字を含む 12 桁の会員カード番号を生成します

PHP は、繰り返しのない数字と文字を含む 12 桁の会員カード番号を生成します

WBOY
リリース: 2016-06-23 14:39:35
オリジナル
1439 人が閲覧しました

データベースに問い合わせることなく、ログインする各メンバーは、数字と文字の一意の組み合わせでメンバーシップ カード番号を生成します。


ディスカッションへの返信 (解決策)

function generate_password( $length = 12 ) {    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';    $password = '';    for ( $i = 0; $i < $length; $i++ )     {        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];    }    return $password;}echo generate_password(12);
ログイン後にコピー

$alpha_numeric = 'abcdefghijklmnopqrstuvwxyz01234567890';
echo substr(str_shuffle($alpha_numeric),0,2).strtotime("now");

タイムスタンプ + セッション ただID ハッシュを計算します
同じルール/順序に従って組み合わせを分割するだけです

GUID を計算してから md5 を取得し、次に sha1 を取得してから 12 桁をインターセプトするなど、多くの方法があります...笑

最も簡単です考えるべきことは、乱数を使用しますが、2 つの結果が明らかに異なることを証明することはできません
MD5 は 32 ビットの結果文字列を生成し、MD5 に「衝突」があることが証明されています。つまり、2 つの異なるコンテンツが同じ MD5 値を持ちます。
同様に、切り捨てを証明することはできません。最終的な MD5 値は元の文字列と同じ一意性を持つため、パラメータとして時間を使用する方が安全です。もちろん、この生成アルゴリズムにも制限があります。 12 桁の 16 進数には、最大で pow(36, 12) 個の状態があります
合計が pow(36, 12) を超えると、必ず繰り返しが発生します

最も簡単に考えられるのは、乱数を使用することですが、それは2 つの結果が異なるはずであることを証明することは不可能です

MD5 は 32 ビットの結果文字列を生成しますが、MD5 に「衝突」があることが証明されています。つまり、2 つの異なるコンテンツが同じ MD5 値を持っています
同様に、切り捨てられた結果も証明することはできません。 MD5 値は元のものと同じです 文字列は同じ一意性を持っています
したがって、時間をパラメータとして使用する方が安全です

function foo() {  $o = $last = '';  do {    $last = $o;    usleep(10);    $t = explode(' ', microtime());    $o = substr(base_convert(strtr($t[0].$t[1].$t[1], '.', ''), 10, 36), 0, 12);  }while($o == $last);  return $o;}
ログイン後にコピー
もちろん、この生成アルゴリズムにも制限があります。 12 桁の 16 進数は最大でも pow(36, 12) 個の状態を持つことができます
合計が pow(36, 12) を超えると、必然的に重複が発生します
司会者の言うことは正しいです。 1階の方法はどうでしょうか?

司会者、この文章は間違って書かれていますか? $o = substr(base_convert(strtr($t[0].$t[1].$t[1], '.', ''), 10, 36), 0, 12);

#1 を使用します。は乱数なので、同一実行内で複数回呼び出されても問題ありません

が、プログラムを複数回実行した場合に問題がないという保証はありません

$o = substr(base_convert(strtr($ t[0].$t [1].$t[1], '.', ''), 10, 36), 0, 12)
何も問題ありません
$t =explode(' ', microtime(); );
$t[0] が実際の小数部分である後、$t[1] は時間の正の部分です
小数部分の長さが異なるため、12 ビットの結果は保証できません
おそらくその方が良いでしょう小数部の長さを直接拡張します

プログラム エラーが報告されました!あなたがそれをテストしてください!

どうしてそれが可能ですか?


エラー メッセージをすべて投稿してください

残りの 41 行には何を書きましたか?なぜ見えないのですか?

エラー メッセージをすべて投稿してください

残りの 41 行には何を書きましたか?なぜ見えないのですか?
解決しました!直接貼り付けたのでスペースが空いてしまいました。 $o=substr(base_convert(strtr($t[0].$t[1].$t[1], '.' ,''), 10, 36), 0, 12);

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート