用于生成大量(以百万计)'n' 位唯一编号的 PowerShell 脚本

PowerShell Script to Generate Large Volume (in millions) 'n' digits Unique Number

我正在尝试编写一个 powershell 脚本来生成大约 900 万个唯一号码。有什么有效的方法吗?

截至目前,我的脚本是,但它正在生成重复值

$start = [long] $startNumber
$end = [long] $endNumber
$random = New-Object System.Random
$number = @()

while ($start -lt $end){

$customerObject = new-object PSObject

    $randomnumber = $random.Next(100000000,999999999)
    while ($number -contains $randomnumber) {
            $randomnumber = $random.Next(100000000,999999999)
     }
    $number += $randomnumber
    [long] $uniqueId = 2000000000 +[long] $randomnumber;



$customerObject | add-member -membertype NoteProperty -name CUSTOMERID -Value $uniqueId 

$start++
$resultsarray += $customerObject

}

与您的重复值相关:您为什么不生成更多值然后通过管道传输到 | sort -unique?然后检查结果数组的长度并在需要时生成更多数组。

至于效率,我猜你不能在 Posh 中更快,但你可以创建 C# 实现,它会更快。

我会维护一个单独的 HashSet<int> 来跟踪已经生成的不同值。

A HashSet 不保留插入顺序,但执行查找的速度非常快,这与常规数组不同,在常规数组中查找性能会在一段时间后变得非常缓慢(您可能已经见过你自己)。

其次,不惜一切代价避免+=。 PowerShell 数组通过重新创建底层数组并将其复制到稍大的数组来调整自身大小。这种不断调整大小也会损害性能。

您可以单独依赖管道,只需 "dropping" 一行中的变量,并将整个 while 循环的输出分配给一个变量,该变量将包含您的随机(有序)顺序:

$random = New-Object System.Random
$set = New-Object 'System.Collections.Generic.HashSet[int]'

$limit = $endNumber - $startNumber

$sequence = while($set.Count -lt $limit)
{
    # Generate random number
    $n = $random.Next(100000000,999999999)

    # Re-generate until a distinct value is produced
    while($set.Contains($n)){
        $n = $random.Next(100000000,999999999)
    }

    # Add value to set
    [void]$set.Add($n)

    # Let value "bubble up" to the variable
    $n
}