String of numbers to Integers (without using .to_i)
So I think using hex isn't in the spirit of the challenge, but that part is easy anyway:

def to_i(digit)
  '0123456789'.index(digit)
end


Your hash idea would have worked fine here too, but the above is a bit terser.

The rest is a good fit for reduce:

def convert(str)
  str.split('').reduce(0) { |m,x| 10 * (m + to_i(x)) } / 10 
end


Or you can forget splitting the solution into 2 functions and just do a 1 liner:

def convert(str)
  str.split('').reduce(0) { |m,x| 10 * (m + '0123456789'.index(x)) } / 10 
end


Finally, another alternative which sacrifices some brevity to mirror the definition of what a number is even more closely:

def convert(str)
  str.split('').reverse().map.with_index { |x,i| to_i(x) * 10**i }.reduce(:+)
end