1 1000 sunucularına 10 haneli karakter kullanıcı kimlikleri atama

3 Cevap php

Bir veritabanı shard ve kendi kullanıcı kimliği dayalı farklı ev sunuculara farklı kullanıcılara atamak bakıyor. Benzersiz ve sürekli belirli bir kırığa her kullanıcı kimliği atamak için 1000 nasıl php bir karma işlev oluşturabilirsiniz -. Kullanıcı kimlikleri her sunucu 1 bir kimliği vardır ... 10 karakter dizeleri, örneğin, "f4gKUKkj91" nelerdir? Kullanıcı kimliği I userid % 1000 yapabileceği bir tamsayı vardı ... ama onlar alfanümerik çünkü ben php bile dağıtımı ile bunu nasıl emin değilim eğer.

Teşekkür ederiz!

3 Cevap

Size alfanümerik kullanıcı kodları sayısal karma verir crc32() hangi kullanabilirsiniz.

Oldukça sorunu almıyorum, ama this link yararlı olabilir gibi görünüyor.

Küçük Kimlik numaraları için hafif bir tercih olacak gibi, bu, mükemmel bir algoritma değildir. Bu kullanıcı kimlikleri tabiri caizse, oldukça eşit yayılmış varsayar; onlar değilseniz, dağılımı iyi olmayabilir.

Senin alfabe ne olduğunu anlamaya ve $str = '0123456789abcdefghijklmnopqrstuvwxxyzABCDEFGHIJKLMNOPQRSTUVXYZ'; Bu dize vardır n karakter gibi bir dize koyun. Şimdi, biz aslında bir baz n tamsayı olarak kullanıcı kimliği tedavi edecek.

Her karakter için, dize (0-tabanlı) onun bir dizin bulabilirsiniz. Bu indeks almak ve n ile çarpın x, burada x, 0 ile başlayan, özgün dize karakter pozisyondur. Arada tüm bu ekleyin ve toplamı modüle almak.

Muhtemelen sadece birkaç karakter için bunu yapmak istiyorum - Birkaç karakter okudum kez, toplamı oldukça büyük olur ve büyük tamsayı matematik için uygun fonksiyonları kullanarak başvurmak sürece PHP düzgün işleyemez (kesinlikle olabilir GMP ve bu kullanabilirsiniz, ancak bu) davanız için ideal olmayabilir. Eğer yerli tamsayılar kullanıyorsanız olası maksimum toplamı 2 ^ 31 (n x + n x+1 + ... + n) ötesinde önce durdurun.

Ya da kullanmak başında veya geriye gidiyor başlayabilirsiniz (geriye gidiyor olağan tamsayı gösterimde karşılık gelir). Bunlardan biri nasıl kimlik nesil eserler bağlı olarak, daha uygun olabilir.