2013-08-21 47 views
0
的LFSR

是否有可能從規模到https://stackoverflow.com/a/9848014/2704706編碼採取了以下功能/解碼的號碼變成11字符串?生成的YouTube式的標識與PHP

function lfsr($x) { 
    return ($x >> 1)^(($x&1) ? 0xe10000 : 0); 
} 
function to_4($x) { 
    for($i=0;$i<24;$i++) 
     $x = lfsr($x); 
    $str = pack("CCC", $x >> 16, ($x >> 8) & 0xff, $x & 0xff); 
    return base64_encode($str); 
} 

function rev_lfsr($x) { 
    $bit = $x & 0x800000; 
    $x = $x^($bit ? 0xe10000 : 0); 
    return ($x << 1) + ($bit ? 1 : 0); 
} 
function from_4($str) { 
    $str = base64_decode($str); 
    $x = unpack("C*", $str); 
    $x = $x[1]*65536 + $x[2] * 256 + $x[3]; 
    for($i=0;$i<24;$i++) 
     $x = rev_lfsr($x); 
    return $x; 
} 

for($i=0; $i<256; $i++) { 
    $enc = to_4($i); 
    echo $enc . " " . from_4($enc) . "\n"; 
} 

我的最終目標是使用這些方法,形成具有編碼ID的網址,以類似的方式向包括在YouTube的URL中的V $ _ GET變量,即RArlg6HeZZM在http://www.youtube.com/watch?v=RArlg6HeZZM視頻的ID。

提前致謝。

+1

使用散列算法有利於「減少」的字符串的東西小;但是你會想用查找來「走另一條路」。 – Floris

+0

我實際上喜歡使用類似於我上面包含的編碼算法而不是哈希算法,這樣我就可以將ID解碼回原始數字表示。 –

+0

您可以使用PHP中的任何加密函數,首先將序列號轉換爲適當長的字符串。 base-64的11個字符大概是64位,或八個字節,這是一個方便的加密塊。 – rici

回答

0

我不知道是什麼,YouTube會,但我會做到這一點:隨機生成一個固定長度的字符串,嘗試將其插入到一個表,它的主鍵,如果你得到一個主鍵例外錯誤,生成一個新的字符串並嘗試再次插入。繼續這樣做,直到最終獲得成功的插入(即一個不在表中的隨機字符串)。我實際上是在一個應用程序中使用它。

編輯: -

或者你可以將其添加爲一個獨特的領域,而不是主鍵:

alter table tbl add randomstring varchar(11) unique; 

那麼你仍然可以有一個auto_increment號作爲主鍵。

+1

感謝您的建議。我寧願編碼一個自動遞增的數字主鍵,而不是使用隨機生成的字符串作爲主鍵,因爲它們允許更快的數據庫查找。 –

+0

看我的編輯。只需將此字段添加爲UNIQUE而不是主鍵即可。 – developerwjk

+0

我擔心的是有人將$ _GET變量中的隨機字符串aKieE9-Oadw傳遞給我的應用程序。而不是使用主鍵查詢數據庫,我將不得不使用隨機字符串的列來執行查詢,這個列的效率必須更低。 –