Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions lib/scatter_swap.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
require "scatter_swap/hasher"

module ScatterSwap
def self.hash(plain_integer, spin = 0)
Hasher.new(plain_integer, spin).hash
def self.hash(plain_integer, spin = 0, length = 10)
Hasher.new(plain_integer, spin, length).hash
end

def self.reverse_hash(hashed_integer, spin = 0)
Hasher.new(hashed_integer, spin).reverse_hash
def self.reverse_hash(hashed_integer, spin = 0, length = 10)
Hasher.new(hashed_integer, spin, length).reverse_hash
end
end
15 changes: 8 additions & 7 deletions lib/scatter_swap/hasher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ module ScatterSwap
class Hasher
attr_accessor :working_array

def initialize(original_integer, spin = 0)
def initialize(original_integer, spin = 0, length = 10)
@original_integer = original_integer
@spin = spin
zero_pad = original_integer.to_s.rjust(10, '0')
@length = length
zero_pad = original_integer.to_s.rjust(length, '0')
@working_array = zero_pad.split("").collect {|d| d.to_i}
end

# obfuscates an integer up to 10 digits in length
# obfuscates an integer up to @length digits in length
def hash
swap
scatter
Expand Down Expand Up @@ -50,12 +51,12 @@ def unswap
end
end

# Rearrange the order of each digit in a reversable way by using the
# Rearrange the order of each digit in a reversable way by using the
# sum of the digits (which doesn't change regardless of order)
# as a key to record how they were scattered
def scatter
sum_of_digits = @working_array.inject(:+).to_i
@working_array = 10.times.collect do
@working_array = @length.times.collect do
@working_array.rotate!(spin ^ sum_of_digits).pop
end
end
Expand All @@ -65,8 +66,8 @@ def unscatter
scattered_array = @working_array
sum_of_digits = scattered_array.inject(:+).to_i
@working_array = []
@working_array.tap do |unscatter|
10.times do
@working_array.tap do |unscatter|
@length.times do
unscatter.push scattered_array.pop
unscatter.rotate! (sum_of_digits ^ spin) * -1
end
Expand Down
29 changes: 25 additions & 4 deletions spec/scatter_swap_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,19 @@
require 'scatter_swap'

describe "#hash" do
it "should be 10 digits" do
it "should be 10 digits by default" do
100.times do |integer|
ScatterSwap.hash(integer).to_s.length.should == 10
end
end

it "should accept a length" do
100.times do |integer|
length = 1 + (integer / 10)
ScatterSwap.hash(integer, 0, length).to_s.length.should == length
end
end

it "should not be sequential" do
first = ScatterSwap.hash(1)
second = ScatterSwap.hash(2)
Expand All @@ -16,8 +23,22 @@

it "should be reversable" do
100.times do |integer|
hashed = ScatterSwap.hash(integer)
ScatterSwap.reverse_hash(hashed).to_i.should == integer
length = 1 + (integer / 10)
hashed = ScatterSwap.hash(integer, 0, length)
ScatterSwap.reverse_hash(hashed, 0, length).to_i.should == integer
end
end

context "When hashed_integer length is less than length used in ScatterSwap.hash" do
it "should be reversable" do
length = 20
integer = 2970439418180909067

hashed = ScatterSwap.hash(integer, 0, length)
# => "02792428384994356370"

ScatterSwap.reverse_hash(hashed, 0, length).to_i.should == integer
ScatterSwap.reverse_hash(hashed.to_i, 0, length).to_i.should == integer
end
end
end
Expand Down Expand Up @@ -84,4 +105,4 @@
s.working_array.should == original_array
end
end
end
end