データベースに問い合わせることなく、ログインする各メンバーは、数字と文字の一意の組み合わせでメンバーシップ カード番号を生成します。
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) を超えると、必ず繰り返しが発生します
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;}
#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);