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

water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New

Other Trending Topics Top

budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews