Linux版にarc4random_uniformがない

投稿者: | 2017年3月15日

さてdatecountがLinuxでもコンパイルできたので、調子に乗ってmkpassもコンパイルしてみたところ…。

arc4random_uniformなんて知らないそうです。もともとSwiftはmacOS(とiOSやwatchOS)用の開発言語でハードウェア専用の機能もあるため、Linux版には存在しない命令もあるでしょう。たとえばクリップボードみたいに。仕方ないね。実際にはarc4random系の機能はBSDの機能だからLinuxにはないみたいなんですが。

検索してみたらstack overflowに解がありました。

arc4randomに相当するのはrandom関数。違いは毎回同じ乱数しか発生しないことと、乱数発生範囲の指定ができないこと。なのでsrandom関数と組み合わせて乱数の発生源をばらつかせ、剰余を使って任意の範囲に抑えることでarc4randomと同じような動作をさせています。

前回書いたOSに合わせたソースコードの切り替えを利用して、次のようなコードにしてみたところ無事コンパイルが通りました。

func get(member:[Character], length:Int) -> (String) {
  var code: UInt32
  #if os(Linux)
  srandom(UInt32(time(nil)))
  #endif
  for _ in 1...length {
    #if os(Linux)
    code = UInt32(random() % member.count)
    #else
    code = arc4random_uniform(UInt32(member.count))
    #endif
    password += "\(member[Int(code)])"
  }
  return password
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です