在PowerShell中是否有将唯一字符串转换为唯一整数的方法?
我使用PowerShell函数作为两个API之间的服务总线, 第一个API产生唯一代码,例如HG44X10999(varchars) - 但第二个API将使用第一个作为输入,只接受整数。我只关心保持它们的独特性。
我查看了$string.gethashcode()
,但这会产生负整数,也会在构建之间发生变化。 Get-hash | $string -encoding ASCII
显然也会输出varchars。
SO上的其他示例是指将一串数字字符转换为整数,即$string = 123
- 但我找不到从字母数字字符串中快速计算int的方法
答案 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