【问题标题】:File with random data but specific size具有随机数据但特定大小的文件
【发布时间】:2015-01-12 21:34:28
【问题描述】:

我正在尝试用 ruby​​ 生成一个具有特定大小的文件。内容无关紧要。

这是我目前所得到的(并且有效!):

File.open("done/#{NAME}.txt", 'w') do |f|
  contents = "x" * (1024*1024)
  SIZE.to_i.times { f.write(contents) }
end

问题是:一旦我 zip 或 rar 这个文件,创建的存档只有几 kb 小。我猜那是因为文件中的随机数据被压缩了。

如何创建更随机的数据,就好像它只是一个普通文件(例如电影文件)?具体来说:如何创建一个包含随机数据的文件,并在存档时保持其大小?

【问题讨论】:

  • 请注意,您的contents 不是随机的。任意的,也许,但不是随机的。

标签: ruby zip filesize rar


【解决方案1】:

您无法保证压缩时的文件大小准确无误。但是,正如您在问题中所建议的那样,完全随机的数据不会压缩。

您可以使用大多数随机数生成器生成随机String。即使是简单的也能够制作难以压缩的数据,但您必须编写自己的字符串创建代码。幸运的是,Ruby 带有一个内置库,它已经有一个方便的字节生成方法,你可以在代码的变体中使用它:

require 'securerandom'
one_megabyte = 2 ** 20 # or 1024 * 1024, if you prefer

# Note use 'wb' mode to prevent problems with character encoding
File.open("done/#{NAME}.txt", 'wb') do |f|
  SIZE.to_i.times { f.write( SecureRandom.random_bytes( one_megabyte ) ) }
end

这个文件不会压缩太多,如果有的话。许多压缩器会检测到这一点并按原样存储文件(使 .zip 或 .rar 文件比原始文件稍大)。

【讨论】:

  • 效果很好!感谢您抽出宝贵时间回答!
  • 也许“完全随机数据不压缩”有点强。随机字符串的一部分可能是“abbbbbbbbbbc”。我希望任何压缩算法都能将整个字符串的大小减少至少六个字节。
  • 是的,我在以前的版本中对此进行了限定,但在这个问题的上下文中,我认为这是一个不同的主题。一旦超出了几个字节和一个不错的 RNG,那么发出可压缩字符串的概率就会很低,以至于“不压缩”基本上是正确的。
  • @CarySwoveland:我刚刚意识到你想用 “随机字符串的一部分可能是“abbbbbbbbbc”... 你错了。你需要考虑压缩算法如何识别压缩流中的这个偶然子字符串,然后才能看到这不起作用(例如,如果它存储了字节偏移量,请考虑在可压缩段之前平均需要多少字节出现了 - 答案原来是随机文件完全相同相同的数量来抵消压缩增益)
  • @CarySwoveland:是的,你没有抓住重点。您的数据不是完全随机的,您只选择了可能字符的子集。压缩器没有在随机性中找到模式,它发现您只使用了 8 位中的 6 位(并且比率 0.75 非常接近您获得的压缩率)。事实上,Math.log(58)/Math.log(256) # => 0.7322 可以更好地预测您的最佳压缩率
【解决方案2】:

对于给定的字符串大小N 和压缩方法c(例如,来自rubyziplibarchiveseven_zip_ruby gems),您希望找到一个字符串str,这样:

str.size == c(str).size == N

我怀疑你是否可以确保找到这样一个字符串,但这里有一个应该接近的方法:

  • 步骤 0:选择一个数字m,这样m > N

  • 第 1 步:生成带有 m 字符的随机字符串 s

  • 第 2 步:计算 str = c(str)。如果str.size <= N,则增加m并重复步骤1;否则转到第 3 步。

  • 第三步:返回str[0,N]

【讨论】:

  • 我认为您已将 OPs 问题重新表述为不再相同的程度。我相信 OP 只想生成“典型的”不可压缩文件,不想要精确匹配,也不想要讨论随机字符串的可压缩性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
相关资源
最近更新 更多