sodapopcan

sodapopcan

In LiveViewTest’s implementation of open_browser, it creates a temp file. To name that, it implements a function that generates a bunch of random bytes which is used to make a filename that looks like: "phx-#{random_id}". The function looks like this:

  def random_id do
    "phx-"
    |> Kernel.<>(random_encoded_bytes())
    |> String.replace(["/", "+"], "-")
  end

and random_encoded_bytes looks like this:

  defp random_encoded_bytes do
    binary = <<
      System.system_time(:nanosecond)::64,
      :erlang.phash2({node(), self()})::16,
      :erlang.unique_integer()::16
    >>

    Base.url_encode64(binary)
  end

My question is not about the implementation of these functions but rather: what’s wrong with simply using "phx#{System.unique_integer()"? I’ve thought on it a bunch but can’t come up with an answer.

Thanks!

mods: I wasn’t exactly sure where to put this. I mention LiveView but the question isn’t really about Phoenix but it’s also not even really about Elixir specifically! Apologies if it needs moving.

Showing Posts 1 to 10

dimitarvp

dimitarvp

Absolutely nothing. :smiley:

Though to remove that last 0.01% chance of collision I’d do it only slightly differently, like so:

  def random_id do
    "phx-"
    |> Kernel.<>(random_encoded_bytes())
    |> String.replace(["/", "+"], "-")
  end

  defp random_encoded_bytes do
    8
    |> :crypto.strong_rand_bytes()
    |> Base.url_encode64()
  end

Or you can use only System.unique_integer but with the :monotonic modifier as well.

sodapopcan

sodapopcan OP

I didn’t think so, but then why the extra ceremony? The only reason I’ve got then is that they already have Phoenix.LiveView.Utils.random_id so may as well use it! Unsure. Anyway, it’s a bit curious though, like, not the most interesting mystery in the world :sweat_smile: I’m porting over some of that code, though, so it’s still gonna bug me. I’ll accept your answer… for now :see_no_evil:

dimitarvp

dimitarvp

I would think they wanted to add more entropy without incurring the extra performance hit of :crypto functions.

sodapopcan

sodapopcan OP

But they are using a :crypto function in random_encoded_bytes.

smathy

smathy

Compatibility with pre-unique_integer OTPs?

dimitarvp

dimitarvp

They are? :thinking: At least I’m not seeing it in the code you posted.

sodapopcan

sodapopcan OP

@smathy Hey, that’s a good thought!

@dimitarvp in this function:

  defp random_encoded_bytes do
    8
    |> :crypto.strong_rand_bytes()
    |> Base.url_encode64()
  end

Unless strong_rand_bytes simply just lives in that module… I’m a bit of a buffoon about this particular stuff.

dimitarvp

dimitarvp

Ummm, but that was just my idea how it can be rewritten…

al2o3cr

al2o3cr

Not sure why it would be useful, but the more-complicated approach has some additional properties:

  • leading with system_time means that a temp file that sorts later in lexicographic order was created later
  • using phash2 means that it’s possible to spot temp files that were made by the same process (though 8-bytes into a base64 value is going to be hard to spot visually)
sodapopcan

sodapopcan OP

I think our wires may be getting crossed! That :crypto. strong_rand_bytes code is in LiveView. I was assuming by your response about crypto that System.unique_integer wraps a crypto function.

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
Onor.io
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
jaybe78
Hello, I’m developing a online persistent chat system (what’s app) like using elixir/dynamodb/aws for a mobile app(flutter). The diffic...
New
Trolleger
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New
widianto
I think I’ve found a small improvement I could contribute to &lt;%= web_namespace %&gt;.CoreComponents (installer/templates/phx_web/compo...
New

Other Trending Topics Top

garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
wintermeyer
There are three potential reasons for members of this forum to have a look at https://vutuv.de You are tired or annoyed of LinkedIn. Yo...
New
webofbits
Aludel - LLM Evaluation Workbench Aludel is an embeddable Phoenix LiveView dashboard for evaluating and comparing LLM prompts across mult...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews