Kredi kartı numarası, sosyal güvenlik numarası gibi seri numaralar
Luhn Algoritması ile oluşturuluyor. Bu numaralar bir süredir merak ettiğim bir konu idi. Benimle aynı merakı paylaşan arkadaşların merakını gidereyim dedim. Bu arada kontör kartı seri numalararı ve diğer seri numalararın hangi algoritmadan yola çıkılarak üretildiğini bilen arkadaşlar varsa bu bilgilerini paylaşırlarsa makbule geçer.
Luhn Algoritması ile ilgili işe yarar T-SQL kodlar:
CREATE FUNCTION dbo.fnIsLuhnValid
(
@Luhn VARCHAR(8000)
)
RETURNS BIT
AS
BEGIN
IF @Luhn LIKE '%[^0-9]%'
RETURN 0
DECLARE @Index SMALLINT,
@Multiplier TINYINT,
@Sum INT,
@Plus TINYINT
SELECT @Index = LEN(@Luhn),
@Multiplier = 1,
@Sum = 0
WHILE @Index >= 1
SELECT @Plus = @Multiplier * CAST(SUBSTRING(@Luhn, @Index, 1) AS TINYINT),
@Multiplier = 3 - @Multiplier,
@Sum = @Sum + @Plus / 10 + @Plus % 10,
@Index = @Index - 1
RETURN CASE WHEN @Sum % 10 = 0 THEN 1 ELSE 0 END
END
CREATE FUNCTION dbo.fnGetLuhn
(
@Luhn VARCHAR(7999)
)
RETURNS VARCHAR(8000)
AS
BEGIN
IF @Luhn LIKE '%[^0-9]%'
RETURN @Luhn
DECLARE @Index SMALLINT,
@Multiplier TINYINT,
@Sum INT,
@Plus TINYINT
SELECT @Index = LEN(@Luhn),
@Multiplier = 2,
@Sum = 0
WHILE @Index >= 1
SELECT @Plus = @Multiplier * CAST(SUBSTRING(@Luhn, @Index, 1) AS TINYINT),
@Multiplier = 3 - @Multiplier,
@Sum = @Sum + @Plus / 10 + @Plus % 10,
@Index = @Index - 1
RETURN @Luhn + CASE WHEN @Sum % 10 = 0 THEN '0' ELSE CAST(10 - @Sum % 10 AS CHAR) END
END
Peter Larsson
Helsingborg, Sweden