sql >> データベース >  >> RDS >> Mysql

auto_incrementを使用したPHPの短い一意のID生成?

    構造上正しいもの、つまり順列関数が必要になります。これは、ある整数(シーケンシャルカウンター)を別の整数に1対1で可逆的にマッピングする関数です。いくつかの例(これらの任意の組み合わせも必要です。仕事):

    • 一部のビットを反転します(たとえば、XORを使用し、PHPでは^)
    • ビットの場所を入れ替える(($ i&0xc)>> 2 |($ i&0x3)<<2)、またはすべてのビットの順序を逆にする
    • 最大範囲を法として定数値を追加します(これを上記のものと組み合わせる場合は、2倍にする必要があります)

    例:この関数は、15までの数値に対して0、1、2、3、5、..を13、4、12、7、15、..に変換します:

    $i=($input+97) & 0xf;
    $result=((($i&0x1) << 3) + (($i&0xe) >> 1)) ^ 0x5;
    

    編集

    より簡単な方法は、次の形式の式で定義される線形合同法(LCG、通常は乱数の生成に使用されます)を使用することです。

    X_n+1 = (a * X_n + c) mod m
    

    適切な値 の場合 a、c、およびmの場合、X_0、X_1のシーケンス.. X_m-1には、0からm-1までのすべての数値が1回だけ含まれます。これで、直線的に増加するインデックスから開始して、 nextを使用できます。 「秘密」キーとしてのLCGシーケンスの値。

    編集2

    実装:独自のLCGパラメーターを設計する ことができます 、しかし、それを間違えると、全範囲をカバーできない(したがって重複する)ので、ここではこの論文

    a = 16807, c = 0, m = 2147483647
    

    これにより、2**31の範囲が得られます。 pack()を使用すると、結果の整数を文字列として取得できます。base64_encode()を使用すると、読み取り可能な文字列(最大6文字、1バイトあたり6ビット)になるため、これが関数になります。

    substr(base64_encode(pack("l", (16807 * $index) % 2147483647)), 0, 6)
    


    1. SQLServerで文字列内の文字列を検索する方法

    2. java.sql.SQLException:不正な文字列値:'\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F ...'

    3. MySQLで丸めずに正確な10進値を取得する方法

    4. MySQLのバージョンを確認する方法