<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Saman</title>
    <description>The latest articles on DEV Community by Saman (@saman-webdev).</description>
    <link>https://dev.to/saman-webdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4125719%2F391a20e9-9308-4cb6-aab8-d2edd4cf5636.png</url>
      <title>DEV Community: Saman</title>
      <link>https://dev.to/saman-webdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saman-webdev"/>
    <language>en</language>
    <item>
      <title>Base64, URL encoding, hashes, UUIDs and Unix timestamps: the one-liners I kept looking up</title>
      <dc:creator>Saman</dc:creator>
      <pubDate>Thu, 29 Oct 2026 06:24:10 +0000</pubDate>
      <link>https://dev.to/saman-webdev/base64-url-encoding-hashes-uuids-and-unix-timestamps-the-one-liners-i-kept-looking-up-276a</link>
      <guid>https://dev.to/saman-webdev/base64-url-encoding-hashes-uuids-and-unix-timestamps-the-one-liners-i-kept-looking-up-276a</guid>
      <description>&lt;p&gt;Every few days I need to Base64 a file, hash a download, or turn an epoch value into a date, and every few days I search for the exact same one-liner. So I finally wrote them down in one place. Copy what you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Base64
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Encode&lt;/th&gt;
&lt;th&gt;Decode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Linux / macOS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;base64 file.png&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;base64 -d encoded.txt&lt;/code&gt; (&lt;code&gt;-D&lt;/code&gt; on older macOS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerShell&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[Convert]::ToBase64String([IO.File]::ReadAllBytes('file.png'))&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[Convert]::FromBase64String($s)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;base64.b64encode(data)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;base64.b64decode(s)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser JS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;btoa(str)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;atob(s)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Buffer.from(str).toString('base64')&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Buffer.from(s, 'base64')&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;base64_encode($data)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;base64_decode($s)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; &lt;code&gt;btoa&lt;/code&gt; only accepts Latin-1. Text with accents or emoji needs a &lt;code&gt;TextEncoder&lt;/code&gt; step first, or it throws.&lt;/p&gt;

&lt;h2&gt;
  
  
  URL encoding
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Encode one value&lt;/th&gt;
&lt;th&gt;Watch out&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;&lt;code&gt;encodeURIComponent(value)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;encodeURI&lt;/code&gt; is for a whole address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;urllib.parse.quote(value, safe='')&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;quote_plus&lt;/code&gt; turns spaces into &lt;code&gt;+&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rawurlencode($value)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;urlencode&lt;/code&gt; uses &lt;code&gt;+&lt;/code&gt; for spaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;&lt;code&gt;URLEncoder.encode(value, "UTF-8")&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;produces &lt;code&gt;+&lt;/code&gt;; use &lt;code&gt;%20&lt;/code&gt; inside a path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Uri.EscapeDataString(value)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;HttpUtility.UrlEncode&lt;/code&gt; uses &lt;code&gt;+&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; if you see &lt;code&gt;%2520&lt;/code&gt;, the value was encoded twice. Decode once, encode once.&lt;/p&gt;

&lt;h2&gt;
  
  
  File hashes (checking a download)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;SHA-256&lt;/th&gt;
&lt;th&gt;MD5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows cmd&lt;/td&gt;
&lt;td&gt;&lt;code&gt;certutil -hashfile file.iso SHA256&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;certutil -hashfile file.iso MD5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerShell&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Get-FileHash file.iso -Algorithm SHA256&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Get-FileHash file.iso -Algorithm MD5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sha256sum file.iso&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;md5sum file.iso&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;shasum -a 256 file.iso&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;md5 file.iso&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hashlib.sha256(data).hexdigest()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hashlib.md5(data).hexdigest()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The result is identical everywhere: a hash depends only on the bytes, never on the tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  UUIDs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;One-liner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;&lt;code&gt;crypto.randomUUID()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;import uuid; uuid.uuid4()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UUID.randomUUID()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Guid.NewGuid()&lt;/code&gt; (&lt;code&gt;Guid.CreateVersion7()&lt;/code&gt; on .NET 9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gen_random_uuid()&lt;/code&gt; (&lt;code&gt;uuidv7()&lt;/code&gt; from PostgreSQL 18)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UUID()&lt;/code&gt; (careful: this is a time-based v1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shell&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uuidgen&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; for database primary keys, prefer v7. It starts with a millisecond timestamp, so new rows land at the end of the index instead of scattering through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unix timestamps
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;th&gt;Timestamp to date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Math.floor(Date.now() / 1000)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;new Date(ts * 1000)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;int(time.time())&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;datetime.fromtimestamp(ts, tz=timezone.utc)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date('Y-m-d H:i:s', $ts)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UNIX_TIMESTAMP()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FROM_UNIXTIME(ts)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;EXTRACT(EPOCH FROM now())&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;to_timestamp(ts)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shell&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date +%s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;date -d @1700000000&lt;/code&gt; (&lt;code&gt;date -r 1700000000&lt;/code&gt; on macOS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Excel&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;=A1/86400 + DATE(1970,1,1)&lt;/code&gt; (UTC)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; 10 digits is seconds, 13 digits is milliseconds. A date in 1970 means you passed milliseconds where seconds were expected, or the other way round.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discord bonus:&lt;/strong&gt; &lt;code&gt;&amp;lt;t:1700000000:R&amp;gt;&lt;/code&gt; renders as a relative time in every reader's own time zone.&lt;/p&gt;




&lt;p&gt;When I don't have a terminal handy, I use the browser versions of these on &lt;a href="https://logicutil.com" rel="noopener noreferrer"&gt;LogicUtil&lt;/a&gt;, a set of free tools that run entirely client-side (nothing is uploaded, no sign-up). Disclosure: I built it. The same tables also live in a GitHub repo: &lt;a href="https://github.com/saman-webdev/dev-one-liners" rel="noopener noreferrer"&gt;saman-webdev/dev-one-liners&lt;/a&gt;. If one of the one-liners above is wrong for your platform, tell me in the comments and I'll fix it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>python</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
