Skip to content

Instantly share code, notes, and snippets.

@jzajpt
Created February 2, 2012 20:00
Show Gist options
  • Save jzajpt/1725433 to your computer and use it in GitHub Desktop.
Save jzajpt/1725433 to your computer and use it in GitHub Desktop.
Encode & decode BSON::ObjectId into more friendly format (base64-like)
class ObjectIdEncoder
attr_accessor :id
def initialize(id)
@id = id.to_a
raise "invalid ID!" unless @id.size == 12
end
def encode
result = []
4.times do |i|
base = i * 3
tmp = @id[base + 2]
tmp |= @id[base + 1] << 8
tmp |= @id[base] << 16
result << TABLE[tmp >> 18]
result << TABLE[(tmp >> 12) & 0x3f]
result << TABLE[(tmp >> 6) & 0x3f]
result << TABLE[tmp & 0x3f]
end
result.join
end
end
class ObjectIdDecoder
attr_accessor :str_id
def initialize(str_id)
raise "invalid ID!" unless str_id.size == 16
@str_id = str_id
end
def decode
result = []
4.times do |i|
base = i * 4
tmp = TABLE.index(@str_id[base + 3])
tmp |= TABLE.index(@str_id[base + 2]) << 6
tmp |= TABLE.index(@str_id[base + 1]) << 12
tmp |= TABLE.index(@str_id[base]) << 18
result << (tmp >> 16)
result << ((tmp >> 8) & 0xFF)
result << (tmp & 0xFF)
end
str_id = result.map { |x| "%.2x" % x }.join
BSON::ObjectId(str_id)
end
end
function ObjectIdEncode(id) {
var TABLE = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
var idArray = [], result = [], i, base, triplet;
for (i = 0; i < 12; ++i) {
base = i * 2;
idArray.push(parseInt(id[base] + id[base + 1], 16));
}
for (i = 0; i < 4; ++i) {
base = i * 3;
triplet = idArray[base + 2];
triplet = triplet | idArray[base + 1] << 8;
triplet = triplet | idArray[base] << 16;
result.push(TABLE[triplet >> 18]);
result.push(TABLE[(triplet >> 12) & 0x3f]);
result.push(TABLE[(triplet >> 6) & 0x3f]);
result.push(TABLE[triplet & 0x3f]);
}
return result.join("");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment