2011-06-03 25 views
4

我有一個包含字母數字值的一些字符串,說唯一的數字 - PHP

asdf1234

qwerty//2345

等。

我要生成一個特定的常數與字符串有關。數不應該匹配生成與其他字符串對應的任何數量的..

+1

號碼?整數,浮點數,有符號/無符號?請明確點。 – 2011-06-03 14:34:05

+0

爲什麼不散列這些字符串?這將爲每個字符串提供不同的值。 – 2011-06-03 14:35:13

+0

是的,具體而言,我正在尋找一個獨特的ID解決方案,我發現號碼/整數更方便,ñ我沒關係哈希.. – 2011-06-03 14:39:07

回答

4

是否有是多少?

你可以簡單地散列字符串,它會給你一個獨特的價值。

echo md5('any string in here'); 

注意:這是一個單向散列,它不能從散列轉換回字符串。

這是如何口令通常存儲(使用這個或其他散列函數,通常與一個「鹽」的方法加入。)檢查一個口令,然後通過散列輸入並比較所存儲的散列進行。

編輯:MD5散列的長度爲32個字符。

看看其他散列函數:
http://us3.php.net/manual/en/function.crc32.php(返回一個數字,可能爲負)
http://us3.php.net/manual/en/function.sha1.php(40個字符)

+0

是否有任何方式來指定哈希長度? – 2011-06-03 14:41:06

+0

@blasteralfred使用此解決方案,它將是32個字符(十六進制數字)。 – kapa 2011-06-03 14:44:00

+0

@blasteralfred我添加了一個鏈接到crc32()函數,該函數返回一個數字,並澄清md5和sha-1的散列長度。 – Fosco 2011-06-03 14:47:35

0

你正在尋找一個散列函數,如md5。您可能想要傳遞$ raw_output = true參數以訪問原始字節,然後將它們轉換爲您希望編號輸入的任何表示形式。

0

加密散列函數將爲您提供每個輸入字符串的不同編號,但它是一個相當大的數字 - 例如在SHA-1的情況下爲20個字節。原則上,兩個字符串可以產生相同的散列值,但發生這種情況的可能性非常小,因此可以忽略不計。

如果你想有一個較小的數字 - 比如,一個32位整數 - 然後,因爲碰撞的概率太高,你不能使用的哈希函數。相反,您需要記錄所有已建立的映射。製作一個將字符串與數字相關聯的數據庫表,並且每次給出字符串時,都要在表中查找它。如果您在那裏找到它,請返回相關號碼。如果沒有,請選擇一個未被任何現有記錄使用的新號碼,並將新的字符串和號碼添加到表格中。

+0

謝謝...我想我可以通過添加/附加我的字符​​串元素在散列的後面或前面來解決此問題.. – 2011-06-03 14:48:48

1

您可以使用散列函數一樣md5,但是這是不是很有趣。

相反,您可以將字符串轉換爲其ASCII字符序列(因爲您說它是字母數字) - 這樣,它可以很容易地轉換回來,對應字符串的長度(長度* 3是精確的),它具有0碰撞的機會,因爲它只是它轉向另一種表示,總是一個數字,這是一個更有趣...示例代碼:

function encode($string) { 
    $ans = array(); 
    $string = str_split($string); 
    #go through every character, changing it to its ASCII value 
    for ($i = 0; $i < count($string); $i++) { 

     #ord turns a character into its ASCII values 
     $ascii = (string) ord($string[$i]); 

     #make sure it's 3 characters long 
     if (strlen($ascii) < 3) 
      $ascii = '0'.$ascii; 
     $ans[] = $ascii; 
    } 

    #turn it into a string 
    return implode('', $ans); 
} 

function decode($string) { 
    $ans = ''; 
    $string = str_split($string); 
    $chars = array(); 

    #construct the characters by going over the three numbers 
    for ($i = 0; $i < count($string); $i+=3) 
     $chars[] = $string[$i] . $string[$i+1] . $string[$i+2]; 

    #chr turns a single integer into its ASCII value 
    for ($i = 0; $i < count($chars); $i++) 
     $ans .= chr($chars[$i]); 

    return $ans; 
} 

例子:

$original = 'asdf1234'; 

#will echo 
#097115100102049050051052 
$encoded = encode($original); 
echo $encoded . "\n"; 

#will echo asdf1234 
$decoded = decode($encoded); 
echo $decoded . "\n"; 

echo $original === $decoded; #echoes 1, meaning true 
+0

真的很有用..... :) ...有什麼方法我可以更改'長度* 3'到'長度* 2'?我是一個初學者.. – 2011-06-04 16:51:53

+0

@blasteralfred - 它的長度* 3,因爲小寫字母的ASCII值高於100,並且使其易於實現在大寫ASCII表示之前附加0。我沒有建議它是最佳的,只是有點有趣。 – Zirak 2011-06-04 18:12:14