id_shuffler 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/id_shuffler/id_shuffler.c +74 -0
- data/lib/id_shuffler.rb +4 -0
- metadata +1 -1
@@ -31,6 +31,9 @@
|
|
31
31
|
*
|
32
32
|
*/
|
33
33
|
|
34
|
+
const int i = 1;
|
35
|
+
#define is_bigendian() ( (*(char*)&i) == 0 )
|
36
|
+
|
34
37
|
const char ftable[256] = {
|
35
38
|
0xa3,0xd7,0x09,0x83,0xf8,0x48,0xf6,0xf4,0xb3,0x21,0x15,0x78,0x99,0xb1,0xaf,0xf9,
|
36
39
|
0xe7,0x2d,0x4d,0x8a,0xce,0x4c,0xca,0x2e,0x52,0x95,0xd9,0x1e,0x4e,0x38,0x44,0x28,
|
@@ -65,6 +68,16 @@ uint32_t g(char key[10], int k, uint32_t w)
|
|
65
68
|
return (((g5<<8) + g6) & 32767); /* clip result to 15 bits */
|
66
69
|
}
|
67
70
|
|
71
|
+
static VALUE r_g1(VALUE self) {
|
72
|
+
char key[10] = {1,2,3,4,5,6,7,8,9,10};
|
73
|
+
return ULONG2NUM(g(key,1,1));
|
74
|
+
}
|
75
|
+
|
76
|
+
static VALUE r_g2(VALUE self) {
|
77
|
+
char key[10] = {1,2,3,4,5,6,7,8,9,10};
|
78
|
+
return ULONG2NUM(g(key,1,32767));
|
79
|
+
}
|
80
|
+
|
68
81
|
uint32_t skip30(char key[10], uint32_t num, int encrypt)
|
69
82
|
{
|
70
83
|
int k; /* round number */
|
@@ -93,6 +106,44 @@ uint32_t skip30(char key[10], uint32_t num, int encrypt)
|
|
93
106
|
return (wr << 15) + (wl);
|
94
107
|
}
|
95
108
|
|
109
|
+
static VALUE r_skip1(VALUE self) {
|
110
|
+
char key[10] = {1,2,3,4,5,6,7,8,9,10};
|
111
|
+
return ULONG2NUM(skip30(key,1,1));
|
112
|
+
}
|
113
|
+
|
114
|
+
static VALUE r_skip2(VALUE self) {
|
115
|
+
char key[10] = {1,2,3,4,5,6,7,8,9,10};
|
116
|
+
return ULONG2NUM(skip30(key,32767,1));
|
117
|
+
}
|
118
|
+
|
119
|
+
static VALUE r_skip3(VALUE self, VALUE original_num) {
|
120
|
+
char key[10] = {1,2,3,4,5,6,7,8,9,10};
|
121
|
+
unsigned long original_ulong;
|
122
|
+
original_ulong = NUM2ULONG(original_num);
|
123
|
+
uint32_t original = original_ulong;
|
124
|
+
return ULONG2NUM(skip30(key,original,1));
|
125
|
+
}
|
126
|
+
|
127
|
+
static VALUE r_skip4(VALUE self, VALUE original_num, VALUE key_str) {
|
128
|
+
char *key = StringValuePtr(key_str);
|
129
|
+
unsigned long original_ulong;
|
130
|
+
original_ulong = NUM2ULONG(original_num);
|
131
|
+
uint32_t original = original_ulong;
|
132
|
+
return ULONG2NUM(skip30(key,original,1));
|
133
|
+
}
|
134
|
+
|
135
|
+
//uint32_t little_endian_swap(uint32_t num)
|
136
|
+
//{
|
137
|
+
// if (is_bigendian()) {
|
138
|
+
// return num;
|
139
|
+
// } else {
|
140
|
+
// return ((num>>24)&0xff) | // move byte 3 to byte 0
|
141
|
+
// ((num<<8)&0xff0000) | // move byte 1 to byte 2
|
142
|
+
// ((num>>8)&0xff00) | // move byte 2 to byte 1
|
143
|
+
// ((num<<24)&0xff000000); // byte 0 to byte 3
|
144
|
+
// }
|
145
|
+
//}
|
146
|
+
|
96
147
|
static VALUE r_base32_shuffle(VALUE self, VALUE original_num, VALUE key_str) {
|
97
148
|
/* takes a number and a key string as input and returns a base-32 encoded
|
98
149
|
* shuffled id. */
|
@@ -114,6 +165,7 @@ static VALUE r_base32_shuffle(VALUE self, VALUE original_num, VALUE key_str) {
|
|
114
165
|
|
115
166
|
/* encrypt */
|
116
167
|
uint32_t original = original_ulong;
|
168
|
+
//uint32_t shuffled = skip30(key, little_endian_swap(original), 1);
|
117
169
|
uint32_t shuffled = skip30(key, original, 1);
|
118
170
|
|
119
171
|
/* base-32 encode the result using "crockford 32" alphabet */
|
@@ -128,6 +180,20 @@ static VALUE r_base32_shuffle(VALUE self, VALUE original_num, VALUE key_str) {
|
|
128
180
|
return rb_str_new(buf,6);
|
129
181
|
}
|
130
182
|
|
183
|
+
static VALUE r_b32(VALUE self, VALUE original_num) {
|
184
|
+
char buf[6];
|
185
|
+
char *digits = "0123456789abcdefghjkmnpqrstvwxyz";
|
186
|
+
int cpos;
|
187
|
+
unsigned long original_ulong;
|
188
|
+
original_ulong = NUM2ULONG(original_num);
|
189
|
+
uint32_t original = original_ulong;
|
190
|
+
for (cpos = 0; cpos < 6; cpos ++) {
|
191
|
+
buf[cpos] = digits[((original >> (5*(5-cpos))) & 31)];
|
192
|
+
}
|
193
|
+
return rb_str_new(buf,6);
|
194
|
+
}
|
195
|
+
|
196
|
+
|
131
197
|
static VALUE r_base32_unshuffle(VALUE self, VALUE shuffled_str, VALUE key_str) {
|
132
198
|
/* take the a base-32 encoded ruby string and a key string, decodes and
|
133
199
|
* unshuffles it, producing the original number. */
|
@@ -164,6 +230,7 @@ static VALUE r_base32_unshuffle(VALUE self, VALUE shuffled_str, VALUE key_str) {
|
|
164
230
|
}
|
165
231
|
|
166
232
|
/* decrypt */
|
233
|
+
//uint32_t original = little_endian_swap( skip30(key, shuffled, 0) );
|
167
234
|
uint32_t original = skip30(key, shuffled, 0);
|
168
235
|
|
169
236
|
/* return a ruby number */
|
@@ -178,5 +245,12 @@ void Init_id_shuffler(void) {
|
|
178
245
|
VALUE klass = rb_define_class("IdShuffler", rb_cObject);
|
179
246
|
rb_define_singleton_method(klass, "shuffle_with_raw_key", r_base32_shuffle, 2);
|
180
247
|
rb_define_singleton_method(klass, "unshuffle_with_raw_key", r_base32_unshuffle, 2);
|
248
|
+
rb_define_singleton_method(klass, "g1", r_g1,0);
|
249
|
+
rb_define_singleton_method(klass, "g2", r_g2,0);
|
250
|
+
rb_define_singleton_method(klass, "skip1", r_skip1,0);
|
251
|
+
rb_define_singleton_method(klass, "skip2", r_skip2,0);
|
252
|
+
rb_define_singleton_method(klass, "skip3", r_skip3,1);
|
253
|
+
rb_define_singleton_method(klass, "skip4", r_skip4,2);
|
254
|
+
rb_define_singleton_method(klass, "b32", r_b32,1);
|
181
255
|
}
|
182
256
|
|
data/lib/id_shuffler.rb
CHANGED