2017-08-25 88 views
1

是否有一種方法可以將唯一的字符串轉換爲PowerShell中的唯一整數?Powershell:將唯一的字符串轉換爲唯一的int

我在兩個API之間使用PowerShell功能作爲服務總線,第一個API生成唯一代碼,例如HG44X10999(varchars) - 但第二個將消耗第一個作爲輸入的API將只接受整數。我只關心保持它們的獨特性。

我看過$string.gethashcode(),但是這會產生負整數,也會在構建之間發生變化。 Get-hash | $string -encoding ASCII顯然也輸出變種。

上的其他例子指的是數字字符串轉換爲整數,即$string = 123 - 但我找不到迅速從字母

+2

什麼是第二個過程接受對INT的限制?只有正面? 16位,32位或64位?第一個過程產生的字符串有什麼限制?長度?允許在特定位置的字符?所有角色保證可打印?所有保證是大寫字母或數字?有許多方法可以實現您所尋求的目標,但您需要知道數據的特徵,如果我們要幫助您,也需要知道。 –

+0

謝謝Jeff - 第二個應用程序的格式是mysql中的bigint(),一個php應用程序將使用它們來構建鏈接。我寧願將它們保持爲相對較小的正整數,例如。 int16或32 – Sum1sAdmin

+0

從Jeff繼續。字符串和它們的整數等價物的一些例子會有所幫助。 – Matt

回答

3

串計算一個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

+0

完美! Mathias,請POSIX_ME_HARDER :-) – Sum1sAdmin

+0

好的 - 我想知道抵消是什麼! – Sum1sAdmin

+0

它引發此錯誤無法將值「2166136261」轉換爲鍵入「System.Int32」。錯誤:「Int32值過大或過小。」爲總理和抵消 – Sum1sAdmin

相關問題