惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
博客园_首页
T
Tailwind CSS Blog
美团技术团队
博客园 - 叶小钗
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
MongoDB | Blog
MongoDB | Blog
The Cloudflare Blog
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog

Nic Lin's Blog

謝明真 - 高效領導力的課後筆記 NFT 開發實戰!基礎智能合約入門 (3) NFT 開發實戰!基礎智能合約入門 (2) NFT 開發實戰!基礎智能合約入門 (1) 如何自我檢測 log4j CVE 漏洞 Rails 如何在資料寫入時記錄來源 IP 位置 如何經營工程師 Youtube 頻道 - Part 8 營收篇 如何經營工程師 Youtube 頻道 - Part 7 酸民文化篇 如何經營工程師 Youtube 頻道 - Part 5 設備器材篇 如何經營工程師 Youtube 頻道 - Part 4 後製剪輯篇 如何經營工程師 Youtube 頻道 - Part 3 文案企劃篇 如何經營工程師 Youtube 頻道 - Part 2 設備器材篇 如何經營工程師 Youtube 頻道 - Part 1 制訂頻道方向篇 如何經營工程師 Youtube 頻道 - Part 0 Rails 中避免 race condition 的最佳實踐(二) Rails 中避免 race condition 的最佳實踐(一) 10 分鐘整合 google sheet 做自動化開發功能週報 經營 Side Project 300 天所帶來的收穫及挑戰 我的 Youtube 影片製作流程 API 設計時必須注意的 HTTP header 底線問題 如何提升你的程式可讀性之實務技巧(三) 如何提升你的程式可讀性之實務技巧(二) 如何提升你的程式可讀性之實務技巧(一) Ruby 中使用 freeze 優化效能的時機 避免 React 中的 useEffect 無限 render 在 Rails 內輕量使用 Vue Component 的最佳實踐 如何在區域網路用 Docker 架設有 SSL 的 Gitlab 從被問到問人,那些我常問的面試問題 [Rails] 如何漂亮寫出可維護的 query (Maintainable Rails Query) 在已知長度情況下優化 slice 的性能
1:1 攪亂器,如何用 Ruby 做可逆推序號
Nic Lin · 2019-05-03 · via Nic Lin's Blog

需求場景:預計 token 最多為 7 位數

1:1 可逆推的攪亂器需要三個數字

  1. 最大值 MAX
  2. 任一質數
  3. 質數 與 MAX 互質的數

只有最後一個可以靠前兩個推算,所以一開始的任務先找出最大值和任一質數就能反推。

找數值

進制最後一碼都是字串 “10”,所以進制數減 1 看最後一碼是什麼,以 32 進制來就去看 31 可以轉成什麼,就是 32 進制的最後一碼。

31.to_s(32)

# "v"

所以我們最多能夠接受七位數的話, 7 個 v 就是極限。

"vvvvvvv".to_i(32)

# 34359738367

我們找到了最大數值

所以 CP_MAX = 34359738367

這時候挑一個質數來用

require 'prime'

Prime.each(CP_MAX) do |prime|
  puts prime
end

假設我挑了 18195539 做為這次的質數,驗證一下是不是質數?

CP_COP = 18195539

Prime.prime?(CP_COP)

# true

接下來反算出 inverse

  def inverse(a, n)
    t = 0 ; newt = 1
    r = n ; newr = a
    while newr != 0
      quotient = r / newr
      t , newt = newt , t - quotient * newt
      r , newr = newr , r - quotient * newr
    end
    return "a is not invertible" if r > 1
    return t < 0 ? t + n : t
  end

CP_COI = inverse(CP_COP, MAX)

反推算出來 CP_COI = 30261274580

ID 攪亂實作

接下來做 ID 攪亂

class User < ApplicationRecord
  CP_MAX = 34359738367
  CP_COP = 18195539
  CP_COI = 30261274580

  def encode_id
    return (self.id.to_i * CP_COP % CP_MAX).to_s(32)
  end

  def self.decode_id(id)
    return id.to_i(32) * CP_COI % CP_MAX
  end
end

試試看 user.id = 1 會拿到什麼?

user = User.first
user.id
# 1

user.encode_id
# "hb92j"

假設拿到攪亂過後的,反推呢?

User.decode_id("hb92j")

# 1

總結

嗯,太煩了,Rails 的話直接用 SecureRandom 放一個欄位打 unique 就可以了。

放欄位還可以很方便 application 做搜尋

參考連結