Powershell:将唯一字符串转换为唯一的int

时间:2017-08-25 12:04:53

标签: powershell

在PowerShell中是否有将唯一字符串转换为唯一整数的方法?

我使用PowerShell函数作为两个API之间的服务总线, 第一个API产生唯一代码,例如HG44X10999(varchars) - 但第二个API将使用第一个作为输入,只接受整数。我只关心保持它们的独特性。

我查看了$string.gethashcode(),但这会产生负整数,也会在构建之间发生变化。 Get-hash | $string -encoding ASCII显然也会输出varchars。

SO上的其他示例是指将一串数字字符转换为整数,即$string = 123 - 但我找不到从字母数字字符串中快速计算int的方法

1 个答案:

答案 0 :(得分:4)

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)(将碰撞机率加倍, 约。 1个4300个1000个不同的输入)

要进一步了解这种简单方法,请参阅this page on FNV并查看this article exploring short string hashing