ruby - 如何在 ruby​​ 中一次解压 7 位?

标签 ruby binary uuid base58

我正在尝试将 UUIDv4 格式化为 url 友好的字符串。 base16 中的典型格式非常长并且有破折号:

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

为了避免破折号和下划线,我将使用 base58(就像比特币一样),以便每个字符完全编码 sqrt(58).floor = 7 位

我可以将 uuid 打包成二进制文件:

[ uuid.delete('-') ].pack('H*')

要获取 8 位无符号整数,其:

binary.unpack('C*')

如何将每 7 位解压缩为 8 位无符号整数?有没有一种模式可以一次扫描7位并将高位设置为0?

最佳答案

require 'base58'
uuid ="123e4567-e89b-12d3-a456-426655440000"
Base58.encode(uuid.delete('-').to_i(16))
=> "3fEgj34VWmVufdDD1fE1Su"

然后再回来

Base58.decode("3fEgj34VWmVufdDD1fE1Su").to_s(16)
 => "123e4567e89b12d3a456426655440000"

从模板重建 uuid 格式的便捷模式

template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
src = "123e4567e89b12d3a456426655440000".each_char
template.each_char.reduce(''){|acc, e| acc += e=='-' ? e : src.next}  
 => "123e4567-e89b-12d3-a456-426655440000"      

关于ruby - 如何在 ruby​​ 中一次解压 7 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33903858/

相关文章:

mysql - 修改 Rails 中的简单搜索以搜索链接数据?

ruby - 我如何在纯 Ruby 中实现 Rails 的 before_initialize/before_new 之类的东西?

ruby-on-rails - 使用 Capybara 和 Selenium 进行记录删除测试失败

python - 加倍二进制数

Python:读取和写入二进制数据

python - TimeUUID 与 Cassandra 和 Lazyboy

database - 在 Postgres 9 中将 UUID 转换为 BIGINT 以在分布式客户端中生成全局 ID 是个好主意吗?

ruby - Gosu/Ruby 安装失败

java - getChar 函数如何工作?

java - UUID随机数生成