En bitmask för behörigheter förstås bäst när den representeras som binär, där varje siffra som representerar en behörighet är på eller av. Så om behörigheterna X, Y och Z finns och jag bara har tillgång till X och Z, 101
skulle representera att jag har den första och tredje behörigheten som jag har fått, men inte den andra. Det binära talet 101
motsvarar decimaltalet 5
, så det är vad som skulle hamna lagrat i databasen. Ett enda litet heltal är ett mycket effektivare objekt att lagra än en sträng eller flera små heltal.
EDIT: Jag insåg hur enkelt det var att utnyttja befintliga konverteringsfunktioner för att få igång en ganska snabb implementering. Här är ett exempel.
<?php
function bitmask_expand($n) {
// 9 returns array(1, 0, 0, 1)
return str_split(base_convert($n, 10, 2));
}
function bitmask_compact($a) {
// array(1, 0, 0, 1) returns 9
return (int) base_convert(implode($a), 2, 10);
}
$ns = range(0, 7);
foreach($ns as $n) {
print_r($b = bitmask_expand($n));
echo bitmask_compact($b), "\n\n";
}
Du kan få bättre prestanda om du använder loopar, snarare än att dra tillbaka till och från strängar, men detta illustrerar principen ganska tydligt.