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.