串計算一個int的方式Fowler-Noll-Vo hash function似乎非常適合爲你的目的,因爲它可以產生一個32位的散列輸出。
這裏是在PowerShell中的簡單實現(偏移基礎和初始主要是從維基百科參考表採取32位輸出):
function Get-FNVHash {
param(
[string]$InputString
)
# Initial prime and offset chosen for 32-bit output
# See https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function
[uint32]$FNVPrime = 16777619
[uint32]$offset = 2166136261
# Convert string to byte array, may want to change based on input collation
$bytes = [System.Text.Encoding]::UTF8.GetBytes($InputString)
# Copy offset as initial hash value
[uint32]$hash = $offset
foreach($octet in $bytes)
{
# Apply XOR, multiply by prime and mod with max output size
$hash = $hash -bxor $octet
$hash = $hash * $FNVPrime % [System.Math]::Pow(2,32)
}
return $hash
}
現在你可以重複產生從輸入字符串不同的整數:
PS C:\> Get-FNVHash HG44X10999
1174154724
如果目標API只接受積極的符號的32位整數,你可以將模數更改爲[System.Math]::Pow(2,31)
(加倍CH碰撞事故,約爲 。 1個4300 1000不同的輸入)
爲了進一步瞭解這種簡單的方法,請參閱this page on FNV和看看this article exploring short string hashing
什麼是第二個過程接受對INT的限制?只有正面? 16位,32位或64位?第一個過程產生的字符串有什麼限制?長度?允許在特定位置的字符?所有角色保證可打印?所有保證是大寫字母或數字?有許多方法可以實現您所尋求的目標,但您需要知道數據的特徵,如果我們要幫助您,也需要知道。 –
謝謝Jeff - 第二個應用程序的格式是mysql中的bigint(),一個php應用程序將使用它們來構建鏈接。我寧願將它們保持爲相對較小的正整數,例如。 int16或32 – Sum1sAdmin
從Jeff繼續。字符串和它們的整數等價物的一些例子會有所幫助。 – Matt