有没有一种方法可以在 PowerShell 中将唯一字符串转换为唯一整数?
我正在使用 PowerShell 函数作为两个 API 之间的服务总线,第一个 API 产生唯一的代码,例如 HG44X10999(varchars)——但第二个 API 将使用第一个作为输入,只接受整数。我只关心保持它们的独特性。
我已经看过了,$string.gethashcode()但这会产生负整数,并且在构建之间也会发生变化。Get-hash | $string -encoding ASCII显然也输出varchars。
SO 上的其他示例是指将一串数字字符转换为整数,即$string = 123- 但我找不到一种从一串字母数字快速计算 int 的方法
在福勒-诺尔-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 上的此页面并查看本文探索短字符串散列
| 归档时间: |
|
| 查看次数: |
1042 次 |
| 最近记录: |