Powershell:将唯一字符串转换为唯一整数

Sum*_*min 2 powershell

有没有一种方法可以在 PowerShell 中将唯一字符串转换为唯一整数?

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

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

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

Mat*_*sen 5

福勒-诺尔-VO散列函数似乎非常适合你的目的,因为它可以产生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
}
Run Code Online (Sandbox Code Playgroud)

现在您可以从输入字符串中重复生成不同的整数:

PS C:\> Get-FNVHash HG44X10999
1174154724
Run Code Online (Sandbox Code Playgroud)

如果目标 API 只接受有符号的 32 位正整数,您可以将模数更改为[System.Math]::Pow(2,31)(将冲突的机会加倍,对于 1000 个不同的输入,大约为 4300 分之一)

要进一步了解这种简单的方法,请参阅FNV 上的此页面并查看本文探索短字符串散列