我有字母數字字符串值。我需要用一個整數值來表示每個字符串。將字符串轉換爲特定範圍之間的整數
生成的整數必須在30到150之間。
多個字符串可以具有相同的整數值。
特定的字符串必須在每次運行時給出相同的整數值。
加密不重要,字符串值不重要。
更快的計算是首選。
所有整數都沒有相同的值。我試過intval()
,但它給了我零。然後我嘗試了md5
和sha1
,這給了我很長的字符串。我試過base_convert
,但無法做到。
我有字母數字字符串值。我需要用一個整數值來表示每個字符串。將字符串轉換爲特定範圍之間的整數
生成的整數必須在30到150之間。
多個字符串可以具有相同的整數值。
特定的字符串必須在每次運行時給出相同的整數值。
加密不重要,字符串值不重要。
更快的計算是首選。
所有整數都沒有相同的值。我試過intval()
,但它給了我零。然後我嘗試了md5
和sha1
,這給了我很長的字符串。我試過base_convert
,但無法做到。
這將需要一個哈希函數。你的範圍是150-30=120
所以你需要模120(% 120
)的結果,並添加30
在PHP中最標準的散列函數(MD5,SHA)是出於安全目的,並返回一個字符串,這些都不是非常有用的。在這種情況下,您可以使用循環冗餘校驗:http://php.net/crc32。這不是一個哈希(值不均勻分佈),但可能足夠接近您的目的。
$stringhash = crc32($string) % 120 + 30;
如果您需要更均勻的分佈,您還可以使用簡單的標準散列,例如, MD5,但這是慢的。
// Take the first 8 alphanumeric digits of the hash (= 32 bits) because we want to keep an int and not convert it to a floating point
$stringhash = intval(substr(md5($string), 0, 8), 16) % 120 + 30;
謝謝,這很酷。 – trante
通過使用@帝特的回答我完成我的功能是這樣的:
public function convertStringToInteger($string, $min, $max, $dateDepended=FALSE) {
$interval = $max-$min;
if ($dateDepended) {
$addMore=strtotime("today");
} else {
$addMore=0;
}
return ((crc32($string)+$addMore) % $interval) + $min;
}
convertStringToInteger("myword",30,150,TRUE);
你能你的代碼添加到這個問題,好嗎? – andrewsi
這就是所謂的「哈希」,谷歌它。 – Barmar
你說你的問題的方式,代表每個字符串的數量爲42會符合你的規格。 – collapsar