Bir dize karşılaştırmak bitsel nasıl

3 Cevap php

Ben, izin dizeleri bir dizi alır az 255 karakterler ve bir varlık onları atar bir işlev üzerinde çalışıyorum. Atanan Her dize tektir, ama, bir diziye bırakarak onları serializing ve bir veritabanına itme ve onları dışarı çekerek daha sonra bunları de-serializing veya bir sorgudan bir yük olduğunu her zaman hesaplamaya gecikmeye neden olmuştur o kadar çok var sorunlar. Özellikle ile izinleri miras.

Yani ben o zaman izinleri glob içine OR'ing bir maske üreten, dize almayı düşünüyordum. Daha izinler eklenir gibi onları glob devam VEYA. Sonra glob karşı izni VE dizesi doğrulamak için gerektiğinde.

Soru maskesi oluşturmak için nasıl. İlk Ben sadece eşsiz bir maske için dize karma düşünüyordum anda, ancak düşünülebilir, ama daha hash değerleri olarak glob üzerine böyle bir bir topak doldurmak için potansiyel OR'ed olduğunu, ne kadar muhtemel bilmiyorum yolu o ve VE onlar, henüz gerçek bir değer döndürmüyor izni ile bir test.

if($glob&&$test == $test)

Diğer seçenek sadece otomatik sayı izni dizeleri olmak ve onların maskesi 2 ^ otomatik sayı olurdu. Ama etrafında 64ish izni dizeleri sayısını sınırlamak olur.

Ne istiyorum gerçekten ben bir kez bir veritabanı çekin ve kullanıcı ile ilişkilendirmek çeşit bir topak olduğunu. Sonra bir izin kümesini temsil eden bir dize veya ilişkili değer karşı olduğunu topak test edin.

3 Cevap

Ben ilginç bir çözüm bulundu ama ben PHP string verilerini nasıl işleyeceğini çok aşina değilim, çünkü ne kadar mantıklı ve doğru ise emin değilim. Her şeyi kesip ve düz herhangi bir karma ya da atama ya da etajer olmadan bunu yapmak için denemek için karar verdi ve sadece dizeleri üzerinde bitsel işlemler yapmak. Bu da işe yaradı, ama ben yeterli benim mantık doğru kanıtlamak emin değilim.

$key1 = "Access to Black Box";
$key2 = "Managing Black Box";
$key3 = "Nothing too see here";
$key3a = "Nothingg B";
$key3b = "too see";
$glob = "";

$glob = $glob | $key1;
if(($glob & $key1) == $key1){echo "<p>Key one exists in glob: " . $glob;}

$glob = $glob | $key2;
if(($glob & $key2) == $key2){echo "<p>Key one exists in glob: " . $glob;}

if(($glob & $key3) == $key3){echo "<p>Key three exists in glob: " . $glob;}
else{echo "<p>Key three does not exists in glob: " . $glob;}

$glob = $glob | $key3;
if(($glob & $key3) == $key3){echo "<p>Key three exists in glob: " . $glob;}

if(($glob & $key3a) == $key3a){echo "<p>Key three a exists in glob: " . $glob;}

if(($glob & $key3b) == $key3b){echo "<p>Key three b exists in glob: " . $glob;} 
else{echo "<p>Key three b does not exists in glob: " . $glob;}

Çıkışlar:

Key one exists in glob: Access to Black Box
Key two exists in glob: Mcoew{nwobnmckkbox
Key three does not exists in glob: Mcoew{nwobnmckkbox
Key three exists in glob: Oomowoomsooboze
Key three a exists in glob: Oomowoomsooboze
Key three b does not exists in glob: Oomowoomsooboze

Yani bu işler, ama ben bilge çarpışmayla ne arıyor olurdu? Key3a I karakterleri ile pozisyonları eşleşen karakterleri bir arada olan bir dize diğer tuşlarla Ben bir yanlış pozitif alabilirsiniz gösterdi. Ama ben izin dizeleri sıkı kurallara etrafında alabilirsiniz? Her kaynak türü olarak adlandırılır ve her bir kaynak türü ilişkili izinleri sınırlı sayıda vardır. Yani "," Yükle ....... Podcast "," Yazıyı Yayınla ... Blog ", Podcast" Blog .... Orta Yayınla "" Mesaj yazın .... Blog "gibi bir şey .... ... dize uzunluğu PHP'nin hızı üzerinde çok az etkisi vardır beri bir çarpışma olasılığı artan telafi etmek için "Yayınla.

Burada düşünce esastır şudur:

Diğer seçenek sadece otomatik sayı izni dizeleri olmak ve onların maskesi 2 ^ otomatik sayı olurdu. Ama etrafında 64ish izni dizeleri sayısını sınırlamak olur.

Izniniz dizeleri birbirinden gerçekten bağımsız ise, o zaman, tabii ki, ne yaparsan yap, bir izin var olup olmadığını saklamak için en az 1 bit gerekir. Hiçbir şekilde etrafında (gerçek, bağımsız, bilgi 1 bit) var.

Senin soruna olası bir çözüm (ki her bir Int16 atamak), ve tüm izinleri bir ikili dizi olarak kullanıcının izni listesini saklamak kompakt bir şekilde izinleri kodlamak olacaktır. Bu çirkin-ish, ama belli belirsiz sorununuzu çözecektir. DB bağlı olarak aslında sizin için bu yapabilirdi kullanılabilir dizi / toplama sütun türlerini bir tür olabilir.

Her dize eşsiz olduğundan, neden bir kez Hashtable (veya benzeri) içine veritabanından onları yüklemek ve kullanıcı oturum süresince bunları önbelleğe değil?