2009-06-03 64 views
4

我正在研究一個函數,它接收一系列少於255個字符的權限字符串並將它們分配給實體。每個分配的字符串都是唯一的,但是有很多將它們放入數組中,將它們序列化並推入數據庫,稍後將它們拉出並解除序列化,或者在每次有負載時從查詢重新計算一直導致延遲問題。特別是具有繼承權限。如何按位比較字符串

所以我想帶串,從它產生屏蔽,然後進入中用OR權限水珠。隨着更多權限的添加,繼續將它們或者添加到glob中。然後當你需要驗證權限和字符串對glob。

問題是如何生成掩碼。起初我只是想爲一個獨特的面具進行散列處理,然而這是可以想象的,但我不知道有多大可能,因爲更多的散列值被「或」到了glob上,方式和AND測試與他們沒有的權限,但返回一個真正的價值。

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

另一個選項只是自動編號的權限字符串和他們的掩碼是2 ^自動編號。但是這會將權限字符串的數量限制在64個左右。

我真正想要的是某種我可以拉出一個數據庫的一次,它與用戶關聯的水珠。然後根據代表權限集的字符串或關聯值來測試該glob。

回答

2

我發現了一個有趣的解決方案,但我不能確定,如果邏輯上是如何正確的,因爲我不是很熟悉PHP如何處理字符串數據。我決定刪除所有內容,並嘗試在沒有任何哈希或分配或什麼的情況下直接進行操作,並對字符串進行按位操作。它似乎工作,但我不確定我能證明我的邏輯是否真實。

$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;} 

輸出:

 
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 

所以這個工作,但我會怎麼被碰撞智慧看?通過key3a,我發現一個字符串組合的字符與其他鍵中的字符匹配,我可以得到一個誤報。但是,我可以通過嚴格的權限字符串規則來解決嗎?每種資源類型都被命名並且每種資源類型都具有有限數量的關聯權限。所以像「Blog ....寫Post」,「Blog ...發佈帖子」,「Blog .... Moderate Post」,「Podcast .......上傳」,「Podcast .... ...發佈「來彌補碰撞的可能性增加,因爲字符串長度對PHP的速度影響不大。

0

由於每個字符串是獨一無二的,爲什麼不從數據庫加載它們一旦進入一個哈希表(或similiar)並緩存在用戶會話的持續時間?

+0

用戶有權限字符串列表, 組擁有權限字符串列表, 用戶可以屬於多個組, 組可以屬於多個組。 每次會話開始時,要遵循權限鏈來封裝所有權限,導致永久登錄後首次加載站點。而且由於權限在會話期間可能會發生變化,因此我需要一種快速重新計算權限的方法,以便在每次頁面加載時都可以對其進行更新。 – 2009-06-03 16:22:36

1

這裏的重要思想是這樣的:

另一種選擇是隻自動編號的許可串並有自己的面具是2 ^自動編號。但是這會將權限字符串的數量限制在64個左右。

如果您的許可字符串彼此真正獨立,那麼顯然,無論您做什麼,您至少需要1位來存儲是否存在權限。這是沒有辦法的(這是一個實際的,獨立的信息)。

一個可能的解決您的問題將進行編碼以緊湊的方式將權限(比如分配的Int16每個),以及用戶的權限列表保存爲他的所有權限的二進制數組。這很醜陋,但它會隱約解決你的問題。根據數據庫你可能實際上有一些可用的陣列/集合列類型,可以爲你做到這一點。