高效地将GUID存储为文本?

3
我们的应用需要我们写出一大堆键(key)、GUID值对,以便导出为纯文本文件。
例如:6004, aa20dc0b-1e10-4efa-b683-fc98820b0fba 可能会有数百万个这样的GUID,并且在写入文件的设备上可能没有太多空间,那么是否有更有效率的方法来输出GUID以减小文件大小呢?
我尝试过16进制编码。
Dim g As Guid = Guid.NewGuid
Dim sb As New Text.StringBuilder
For Each b As Byte In g.ToByteArray
  sb.Append(String.Format("{0:X2}", b))
Next
Console.WriteLine(sb.ToString)

这个方法将GUID压缩至32个字符,每行都稍微短一些:

9870, EBB7EF914C29A6459A34EDCB61EB8C8F

是否有其他更高效的方法将GUID写入文件中?


你能把它存储到数据库中吗?这样查询会更容易。 - Sandesh Gupta
不,必须按照问题中指定的方式将翻译后的文本写入文本文件。 - Mary
1
十六进制编码每个字符仅编码4位,与Guid.ToString()相比并没有更好的效果。Base64每个字符使用6位,比Hex编码效率高50%,建议使用Guid.ToByteArray + Convert.ToBase64String。在文本文件中避免使用难以反向工程的编码方案,因为磁盘存储非常便宜。 - Hans Passant
保存为普通 GUID,然后压缩文件怎么样? - Magnus
1个回答

1
我同意之前的评论,SQL会是理想的选择(或者其他数据库),文本文件可能非常不稳定。我刚刚做了一些快速测试,迭代了数百万个GUID并存储在文本文件中。
以下是结果,基本上超过100万个GUID的任何内容都会开始出现问题。您可以安全地存储1000万个,但该文件将难以打开(在普通PC上)因为它大于150MB,请参见下文:

GUID Testing 100-10mill

以下是我使用的代码,如果你想尝试一下的话。我知道它并不完美,但可以让你了解时间去哪里了。主要结论是通过批量追加文件来附加文件,如果可能的话不要尝试逐个附加每个GUID。这样可以节省大量处理和时间!
即使您将其转换为其他格式,如基础或二进制,我认为您仍会得到类似的文件大小变化,不要忘记,您仍然只是将其保存为文本文件,二进制由于字符串长度而无疑是较大的文件大小!
希望这有所帮助,如果需要任何帮助,请回复评论!
鸡肉
Dim Report_List As List(Of String)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Report_List = New List(Of String)
    Dim Zeros As Integer = 2
    Do While Zeros < 8
        Dim sw As Stopwatch = New Stopwatch
        sw.Start()
        Dim CountName As String = "1" & Microsoft.VisualBasic.Left("00000000000000000000000", Zeros)
        Dim CountNum As Integer = CInt(CountName)

        Dim Master_String As System.Text.StringBuilder = New System.Text.StringBuilder

        For i = 1 To CountNum
            Dim g As Guid = Guid.NewGuid
            'Dim sb As New System.Text.StringBuilder
            'For Each b As Byte In g.ToByteArray
            '    sb.Append(String.Format("{0:X2}", b))
            'Next
            'Master_String.AppendLine(sb.ToString)
            'Master_String.AppendLine(sb.ToString)
            Master_String.AppendLine(Convert.ToBase64String(g.ToByteArray))
            i += 1
        Next

        Using sr As StreamWriter = New StreamWriter("c:\temp\test-" & CountName & ".txt", False)
            sr.Write(Master_String.ToString)
        End Using

        sw.Stop()
        Report_List.Add(sw.Elapsed.ToString & " - " & CountName)

        Zeros += 1
    Loop

    For Each lr In Report_List
        Me.ListBox1.Items.Add(lr)
    Next
End Sub

谢谢!你尝试过在问题评论中建议的使用Convert.ToBase64String()吗? - Mary
我刚刚使用Base64重新运行了一下,文件大小减少了24%,所以这对你来说肯定更好,同时处理时间也降低了约80%(如果这有帮助的话)。 - Chicken
我已经更新了帖子,如果你想试一下,可以看看新代码。谢谢! - Chicken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接