MySQL PHP Rasgele Sayı Üretimi

8 Cevap php

Ben 16 milyon kayıtları var ve ayrıca 01 ile başlatmak için tüm numaralarını istiyorum, ve ayrı bir tabloda saklayabilirsiniz, her kayıt için 8 haneli bir EŞSİZ rasgele sayı gerekir, bu yüzden ben her kayıt için benzersiz numaraları atayabilirsiniz.

Ben 16 milyon EŞSİZ numaralarını almak için PHP bunu nasıl emin değilim?

Lütfen yardım edin!

J.

8 Cevap

Belirttiğiniz ne, bu mümkün görünmüyor.

Bu lider 2 olduğu belirli bir 8 digit sayıda ikinci 16,000,000 benzersiz numaralar gerektirir 01.

Bu sadece 6 numbers ile başbaşa bırakır, böylece aralık 1,000,000 sayılar olacak

dan 01000000 to 01999999.

Bu hiç doğru görünmüyor.

Pavium için Yorum ile ilgili John, rasgele mutlaka tam olarak aynı uzunlukta değil sahip tüm numaraları gerekiyorsa olabilir make use of the ZEROFILL MySQL property auto_increment indeksi ile birlikte.

GUID: Bu deneyin

<? 
    echo str_replace ("}","",str_replace("{","",com_create_guid()));
?>

Her kayıt için bir unique sayı üretme olağan yolu auto_incrementing değerine sahip olmaktır - bu yüzden rastgele değil benzersiz olacak, ama.

.. Ve onlar MySQL, PHP ile oluşturulmuş olacak. Ben PHP 16 milyon rasgele ama farklı sayı üretmek için önemli bir havai olacağını düşünüyorum.

Sayılar have rastgele olmak mı? Belki de benzersiz daha önemli bir gerekliliktir?

Kolay yolu ilk rakamlar 16M sayılar ve rastgele çeşit onları bir listesini oluşturmak ve sonra kaydınız için her haritasına, ve PHP doğal işlevleri hemen hemen yapılabilir.

// Assume steps of 500
$steps = 500;
$MAXNO  = 16000000;
$increament = $MAXNO/$steps;
// 16M array produces too much memory, shorten it by divide the array to number chunks
for ($i=1; $i<$steps; $i++) {
    // Create a initial ids from 1 to 16M
    $data = range(($i-1)*$increament+1, $i*$increament);
    echo ($i-1)*$increament+1 . ' - '. $i*$increament . "\n";
    // Randomise array content
    shuffle($data);
    // Now you just need to loop thu the array to map each to your db row.
    foreach ($data as $rnd)
    {
    	// Format the random no to a 6 digit long digit, and put 01 in the front
    	$unique_id = sprintf('01%06d', $rnd);
    	// echo $unique_id . "\n";
    	// break;
    }
}
?>

Bir çok büyük bir dizi oluşturmak değil ki ben, bir atlama döngü ekledik. Ama aynı zamanda id tür bir increamenting benziyor olabilir, ama yine rastgele sayılar anlamına.

Belki birisi dönen dize kullanarak daha iyi bir çözüm ile gelip? Ben şimdi işten duyuyorum. :)

Bunun yerine rastgele sayı üreten ve sırayla sayı üreten ama rastgele düzende kayıtları güncellemek konusunda seçilmiş olan parça numaralarını, nasıl tutulması ile mücadele?

Yani, burada tamamen MySQL çözümdür. Hiç PHP, hayır döngü, sadece bir toplu güncelleştirme bildirimi:

UPDATE 
   your_table, 
   (SELECT @rownum:=@rownum+1 rownum, t.id 
    FROM 
      (SELECT @rownum:=0) r, 
      (SELECT id FROM your_table ORDER BY RAND()) t
   ) p 
SET unique_num = 100000000 + p.rownum 
WHERE p.id = your_table.id

Benzersiz numara tablonun birincil anahtar sütunu ile saklanır ve id olacak sütunu ile, tablo adı ile your_table unique_num olarak değiştirin.

p / s: test MySQL 5.1.37, en az çalışan

mysql bunu sizin için adres:

  1. bir auto_increment sütun oluşturmak
  2. UPDATE kullanarak 1 eklemek
  3. bitti!

Eğer gerçekten önde gelen sıfır gerekiyorsa, o zaman, sütundan AUTO_INCREMENT kaldırmak varchar (1) olarak değiştirin ve kullanarak UPDATE Önlerine

Ben rastgele birincil anahtarlar için 16 karakter baz-60 varchar kullanmak ister. Burada küçük bir tabela:

mysql> create table foo (k varchar(16), v varchar(255), primary key(k));

... Ve burada kullanılmayan bir anahtarı bulana kadar fonksiyonu k () vuracaktır bazı ilkel PHP bulunuyor.

<?php

require_once 'connect.php';

$v = 'A value that needs a unique random key.';

while (!mysql_query("INSERT INTO foo VALUES ('" . k() . "', '$v')")) {};

function k() {
   $t = "0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
   $r = "";
   for ($i = 0; $i < 16; $i++) {
      $r .= substr($t, rand(0, 59), 1);
   }
   return $r;
}

?>

Ile 16 - 60 - Bir çarpışma şansı küçük olacak şekilde k () iki kez çağrılır hemen hemen hiç. Bonus: Ben hiç bir varchar olduğunu anahtar büyütmek gerekir, bu yüzden tabloda zaten her şeyi Scragging olmadan bayt ekleyebilirsiniz eğer.